读取java exec的输出

max*_*rmo 30 java runtime runtime.exec

你好,我有一些关于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);
}
Run Code Online (Sandbox Code Playgroud)

在那个代码我试图得到一个java版本命令执行是好的,但我无法读取输出它只是返回null.为什么?

ada*_*ost 52

使用getErrorStream().

BufferedReader in = new BufferedReader(new InputStreamReader(pr.getErrorStream()));
Run Code Online (Sandbox Code Playgroud)

编辑:

您可以使用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);
Run Code Online (Sandbox Code Playgroud)

  • 好的,工作了。但奇怪的是从错误流中读取命令的正常输出。 (2认同)

Bul*_*aza 9

请注意,我们正在逐行读取过程输出到我们的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();
    }
}
Run Code Online (Sandbox Code Playgroud)

打印:

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)
Run Code Online (Sandbox Code Playgroud)