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);
}
}
}
}
添加回答
舉報