читать вывод из Java Exec - PullRequest
       72

читать вывод из Java Exec

30 голосов
/ 16 ноября 2011

Здравствуйте, у меня есть вопрос о Java. вот мой код:

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

в этом коде я пытаюсь заставить команду java version выполнить, все в порядке, но я не могу прочитать вывод, он просто возвращает ноль. Почему?

Ответы [ 4 ]

51 голосов
/ 16 ноября 2011

Использование getErrorStream () .

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

РЕДАКТИРОВАНИЕ:

Вы можете использовать ProcessBuilder (а также читать документацию)

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);
9 голосов
/ 18 июня 2015

Обратите внимание, что мы построчно читаем вывод процесса в наш StringBuilder. Из-за оператора try-with-resources нам не нужно закрывать поток вручную. Класс ProcessBuilder позволяет нам передать имя программы и количество аргументов в ее конструктор.

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

Печать:

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)
2 голосов
/ 16 ноября 2011

У вас уже есть -объект -объект (имя pr).Вы можете получить Input-, Output- и Errorstream.В вашем случае вы хотите pr.getInputStream () .Читайте из того, что связано с выходом процесса.

0 голосов
/ 02 июля 2015

попробуйте

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