web-dev-qa-db-fra.com

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'essaye d'obtenir une commande de version Java version est ok, mais je ne peux pas lire la sortie, elle retourne simplement null. Pourquoi?

30
maxormo

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);
51
adatapost

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)
9
BullyWiiPlaza

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.

2
Mnementh

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.

0
Kideok Kim

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