首先,启动外部程序的首选方法是通过
ProcessBuilder。在文档中
Runtime甚至提到了:
现在,ProcessBuilder.start()是使用修改后的环境启动进程的首选方法。
在
ProcessBuilder你有一个非常方便的方法叫做
redirectErrorStream:
设置此流程生成器的redirectErrorStream属性。
如果此属性为true,则 随后由该对象的start()方法启动的子流程生成的任何错误输出都将与标准输出合并
,以便可以使用Process.getInputStream()方法读取两者。这使得将错误消息与相应的输出关联起来更加容易。初始值为false。
有关如何输出标准误差和标准输出的完整示例:
import java.io.*;public class Test { public static void main(String... args) throws IOException { ProcessBuilder pb = new ProcessBuilder("java", "-cp", "yourClassPath", "HelloWorld"); pb.redirectErrorStream(true); Process proc = pb.start(); Reader reader = new InputStreamReader(proc.getInputStream()); int ch; while ((ch = reader.read()) != -1) System.out.print((char) ch); reader.close(); }}
对您的更新的回复:不,代码与
while ((c = in1.read()) != -1 || (c = in2.read()) != -1)
将不会起作用,因为这
read()是一种阻塞方法,并且您只有一个线程。您唯一的选择是每个输入流使用一个线程,或者(最好)使用将两个输入流合并为一个线程
ProcessBuilder.redirectErrorStream。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)