45 votes

lire la sortie de java exec

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'essaie d'exécuter une commande de version Java, mais je ne peux pas lire la sortie, elle renvoie simplement null. Pourquoi?

69voto

AVD Points 57984

Utilisez getErrorStream() .

 BufferedReader in = new BufferedReader(new InputStreamReader(pr.getErrorStream()));

ÉDITER:

Vous pouvez utiliser ProcessBuilder (et aussi 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);

2voto

Mnementh Points 19831

Vous avez déjà le processus -objet (nom pr). Vous pouvez obtenir les 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.

0voto

Kadir BASOL Points 441

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]));
}

0voto

Kideok Kim Points 133

J'ai également eu ce problème car je n'ai pas correctement défini $JAVA_HOME. (J'ai oublié Contenu/Accueil). Après avoir modifié $JAVA_HOME, mis à jour Gradle JVM et supprimé le répertoire .idea pour le reconstruire avec gradle, cela fonctionne bien.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X