1 回答
TA贡献1963条经验 获得超6个赞
根据情况,可能需要读取错误流而不是输入流,例如,如果您的第二个 java 调用是-version或您调用的程序仅写入 stderr 而不是 stdout 获取错误流是正确的方法。
我写了这个 MCVE:
import java.io.*;
public class Starter {
public static void main(String[] args) throws IOException {
ProcessBuilder pb = new ProcessBuilder("./dosomething.sh");
File dir = new File(new File(File.listRoots()[0], "tmp"), "2jvm");
pb.directory(dir);
Process p = pb.start();
BufferedReader read = new BufferedReader(new InputStreamReader(p.getErrorStream()));
String line;
while ( (line = read.readLine() ) != null) {
System.out.println("line: " + line);
}
}
}
在“dosomething.sh”中:
echo before
java -version
echo after
当我使用时,p.getInputStream我会得到“之前”和“之后”。当我使用时,p.getErrorStream我会得到 Java 版本信息。这对你来说也可能是真的。我建议您echo在批处理文件中添加行以查看它们是否被打印出来。
我还写了一个简单的 hello world,当我从中调用它时,dosomething.sh它会按预期打印到输入流中。写入标准错误是一个奇怪的怪癖。-version
为了完整起见,这里是我使用的 Hello World(它等待模拟长时间运行的服务器进程):
public class Caller {
public static void main(String[] args) {
synchronized(Caller.class) {
for(int ii = 0; ii < 10; ii++) {
try {
Caller.class.wait(1000);
} catch (Exception ex) {
ex.printStackTrace();
}
System.out.println("Hello world! " + ii);
}
}
}
}
添加回答
举报