1 回答
![?](http://img1.sycdn.imooc.com/5333a1d100010c2602000200-100-100.jpg)
TA贡献1775条经验 获得超11个赞
有两个与系统有关的东西。
首先,p.waitFor()在读取程序输出之前,您正在等待过程完成。当管道的容量用尽时,这可能会永远阻塞,因为该程序仅在写入所有输出后才能完成。管道的实际容量取决于系统且未指定。
此外,由于不提供任何参数是错误的情况,因此可能是消息已写入错误流而不是标准输出的情况。在这种情况下,您将不得不阅读p.getErrorStream()而不是阅读p.getInputStream()(在我的系统上,情况并非如此)。
因此,您可以尝试
Runtime rt = Runtime.getRuntime();
try {
String cmd = "javac";
// OR String cmd = "cmd /c javac";
// OR String cmd = "java -cp myjar com.my.sample";
Process p = rt.exec(cmd);
BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()));
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
p.waitFor();
} catch(Exception e){
e.printStackTrace();
}
如果完成后仍未打印任何内容,请尝试p.getErrorStream()使用p.getInputStream()。
但是,如果您只想将子进程的输出打印到控制台,则可以做得更好:
try {
String cmd = "javac";
// OR String cmd = "cmd /c javac";
// OR String cmd = "java -cp myjar com.my.sample";
Process p = new ProcessBuilder(cmd).inheritIO().start();
p.waitFor();
} catch(Exception e){
e.printStackTrace();
}
这会将您的输入和输出通道连接到子流程的输入和输出通道。因此,在这种情况下,您无需处理管道。
但是,如果您实际上想在程序中处理输出,即打印只是一个示例,ProcessBuilder仍然有一个有趣的选项:
try {
String cmd = "javac";
// OR String cmd = "cmd /c javac";
// OR String cmd = "java -cp myjar com.my.sample";
Process p = new ProcessBuilder(cmd).redirectErrorStream(true).start();
BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()));
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
p.waitFor();
} catch(Exception e){
e.printStackTrace();
}
通过使用redirectErrorStream(true),您告诉它将所有错误输出与标准输出写入同一通道,因此只有一个输出要处理。
添加回答
举报