BufferedReader.readLine阻止我的程序,但BufferedReader.read()正确读取

Des*_*tor 12 java bufferedreader

我有一个片段如下:

Process proc = Runtime.getRuntime().exec(command);
BufferedReader br = new BufferedReader(new InputStreamReader(proc.getErrorStream()));
String line = br.readLine();
Run Code Online (Sandbox Code Playgroud)

现在在上面的代码中我确信该进程将始终具有在线输入,因此我没有使用任何类型的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);
}
Run Code Online (Sandbox Code Playgroud)

令我惊讶的是,这段代码工作并打印出麻烦的新行和回车.现在我想知道为什么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.
Run Code Online (Sandbox Code Playgroud)

我想区分我的错误流和输入流,但是使用这种方法它们都混乱了!有什么想法吗?

µTh*_*ory 0

因此,为了避免合并错误流和输入流,只需删除该行 pb.redirectErrorStream(true);

因为正如 java 文档中所说:

如果此属性为 true,则随后由该对象的 start() 方法启动的子进程生成的任何错误输出都将与标准输出合并,以便可以使用 Process.getInputStream() 方法读取两者。这使得更容易将错误消息与相应的输出关联起来。初始值为假。

通过调用pb.redirectErrorStream(true);您可以合并两个输出。