我有如下代码片段:
Process proc = Runtime.getRuntime().exec(command);
BufferedReader br = new BufferedReader(new InputStreamReader(proc.getErrorStream()));
String line = br.readLine();
现在在上面的代码中,我确定进程总是会有一行输入,所以我没有使用任何while循环或任何空值检查。问题在于readLine阻塞了。我知道的一个原因是,流没有数据可读,因此readLine一直在等待。为了验证这一点,我删除了readLine并使用了read()函数,如下所示:
Process proc = Runtime.getRuntime().exec( command );
BufferedReader br = new BufferedReader(new InputStreamReader(proc.getErrorStream()));
int a;
while((a=br.read())!=-1){
char ch = (char) a;
if(ch == '\n')
System.out.print("New line "+ch);
if(ch == '\r')
System.out.print("Carriage return "+ch);
System.out.print(ch);
}
令我惊讶的是,这段代码运行成功并打印出了“New line”和“Carriage return”的消息。现在我正在想为什么readLine会阻塞呢?数据是可用的,并以换行符结尾。还有什么其他原因吗?
注意:以上内容有时只能工作一次!可能是15次中的一次。
注意:我也尝试使用ProcessBuilder,但结果相同。
更新: 所以我切换到ProcessBuilder,然后重定向了errorStream,现在当我执行process.getInputStream时可以同时获得输入流和错误流,这个方法很好用。以下是摘录:
ProcessBuilder pb = new ProcessBuilder(command.split(" "));
pb..redirectErrorStream(true);
Process proc = pb.start();
BufferedReader br = new BufferedReader(new InputStreamReader(proc.getInputStream()));
String line = br.readLine();
//Now I get both input and error stream.
我想将错误流与输入流区分开来,但是使用这种方法它们都混在一起了!有什么建议吗?
while (line != null) { line = br.readLine(); }
只是出于好奇。也许在你想读取所需行之前,会有一个简单的换行符? - Martin Frankwhile ((line=br.readLine())!=null) { do something}
,但即使这样也不起作用,因为我们读取一行并检查它是否为空,如果是,则执行某些操作。问题在于readLine永远不会返回。 - Destructor