Java从单独的进程中获取标准输出和标准错误

时间:2015-06-24 01:52:40

标签: java

我正在使用ProcessBuilder在我的Java程序中启动一个单独的进程。这是进程:

Class klass=Program.class;
String[] output=new String[2];
 String javaHome = System.getProperty("java.home");
 String javaBin = javaHome +
         File.separator + "bin" +
         File.separator + "java";
 String classpath = System.getProperty("java.class.path");
 String className = klass.getCanonicalName();

 ProcessBuilder builder = new ProcessBuilder(
         javaBin, "-cp", classpath, className);

 Process process = builder.start();
 process.waitFor();

Program.class如下:

public class Program {
public static void main(String[] args) {
System.out.println("Hi!");
}

我希望标准输出产生Hi!,标准错误,例如,如果我在System.out.println("Hi!")之后不添加分号,那么标准错误将是:

Exception in thread "main" java.lang.Error: Unresolved compilation problem: 
Syntax error, insert ";" to complete BlockStatements

at Program.main(Program.java:6)

那么,我该怎么做呢?理想情况下,程序将这些转换为两个字符串。

由于

1 个答案:

答案 0 :(得分:2)

首先仔细查看Process类,它具有inputStream属性,该属性附加到进程stdout。您还可以使用ProcessBuilderstderr重定向到stdout,以便更轻松地使用ProcessBuilder#redirectErrorStream(boolean)

您可以使用Process属性写信outputStream(尽量不要考虑太多)...

基本上,您希望通过inputStream“读取”“输出”,并通过outputStream

“写入”“输入”

像...一样的东西。

Class klass=Program.class;
String[] output=new String[2];
String javaHome = System.getProperty("java.home");
String javaBin = javaHome +
     File.separator + "bin" +
     File.separator + "java";
String classpath = System.getProperty("java.class.path");
String className = klass.getCanonicalName();

ProcessBuilder builder = new ProcessBuilder(
     javaBin, "-cp", classpath, className);
builder.redirectErrorStream(true);

Process process = builder.start();
int in = -1;
InputStream is = process.getInputStream();
try {
    while ((in = is.read()) != -1) {
        System.out.println((char)in);
    }
} catch (IOException ex) {
    ex.printStackTrace();
}
int exitCode = process.waitFor();
System.out.println("Exited with " + exitCode);

作为例子