Bonjour j'ai une question sur Java. voici mon code:
public static void main(String[] args) throws Exception {
Process pr = Runtime.getRuntime().exec("Java -version");
BufferedReader in = new BufferedReader(new InputStreamReader(pr.getInputStream()));
String line;
while ((line = in.readLine()) != null) {
System.out.println(line);
}
pr.waitFor();
System.out.println("ok!");
in.close();
System.exit(0);
}
dans ce code, j'essaye d'obtenir une commande de version Java version est ok, mais je ne peux pas lire la sortie, elle retourne simplement null. Pourquoi?
Utilisez getErrorStream () .
BufferedReader in = new BufferedReader(new InputStreamReader(pr.getErrorStream()));
ÉDITER:
Vous pouvez utiliser ProcessBuilder (et également lire la documentation)
ProcessBuilder ps=new ProcessBuilder("Java.exe","-version");
//From the DOC: Initially, this property is false, meaning that the
//standard output and error output of a subprocess are sent to two
//separate streams
ps.redirectErrorStream(true);
Process pr = ps.start();
BufferedReader in = new BufferedReader(new InputStreamReader(pr.getInputStream()));
String line;
while ((line = in.readLine()) != null) {
System.out.println(line);
}
pr.waitFor();
System.out.println("ok!");
in.close();
System.exit(0);
Notez que nous lisons la sortie du processus ligne par ligne dans notre StringBuilder
. En raison de try-with-resources
instruction nous n'avons pas besoin de fermer le flux manuellement. La classe ProcessBuilder
nous permet de soumettre le nom du programme et le nombre d'arguments à son constructeur.
import Java.io.BufferedReader;
import Java.io.IOException;
import Java.io.InputStreamReader;
public class ProcessOutputExample
{
public static void main(String[] arguments) throws IOException,
InterruptedException
{
System.out.println(getProcessOutput());
}
public static String getProcessOutput() throws IOException, InterruptedException
{
ProcessBuilder processBuilder = new ProcessBuilder("Java",
"-version");
processBuilder.redirectErrorStream(true);
Process process = processBuilder.start();
StringBuilder processOutput = new StringBuilder();
try (BufferedReader processOutputReader = new BufferedReader(
new InputStreamReader(process.getInputStream()));)
{
String readLine;
while ((readLine = processOutputReader.readLine()) != null)
{
processOutput.append(readLine + System.lineSeparator());
}
process.waitFor();
}
return processOutput.toString().trim();
}
}
Tirages:
Java version "1.8.0_45"
Java(TM) SE Runtime Environment (build 1.8.0_45-b15)
Java HotSpot(TM) 64-Bit Server VM (build 25.45-b02, mixed mode)
Vous avez déjà l'objet processnom pr). Vous pouvez obtenir le flux d'entrée, de sortie et d'erreur. Dans votre cas, vous voulez --- (pr.getInputStream () . Lisez à partir de cela, qui est connecté à la sortie du processus.
J'ai également rencontré ce problème car je n'ai pas correctement défini $ Java_HOME. (J'ai oublié Contenu/Accueil).
Après avoir édité $ Java_HOME, mis à jour Gradle JVM et supprimé le répertoire .idea pour reconstruire avec gradle, cela fonctionne bien.
essaye ça
public static final Pair<Integer,Integer> javaVersion(File file) throws IOException {
final ProcessBuilder pb = new ProcessBuilder("Java", "-version");
pb.directory(new File(file.getCanonicalPath() + File.separator + "bin"));
pb.redirectErrorStream(true);
// Call the test target
final Process process = pb.start();
final InputStream in = process.getInputStream();
final InputStream err = process.getErrorStream();
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(in,"UTF-8"));
String s = bufferedReader.readLine();
int start = s.indexOf('\"');
int end = s.lastIndexOf('\"');
String substring = s.substring(start + 1, end);
String[] split = substring.split("\\.");
return new Pair<>(Integer.parseInt(split[0]),Integer.parseInt(split[1]));
}