gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-30 21:12:21 29 4
gpt4 key购买 nike

我有一个片段如下:

Process proc = Runtime.getRuntime().exec(command);
BufferedReader br = new BufferedReader(new InputStreamReader(proc.getErrorStream()));
String line = br.readLine();

现在在上面的代码中,我确信进程总是有在线输入,所以我没有使用任何类型的 while 循环或任何 null 检查。问题是 readLine block 。我知道的一个原因是,流没有数据可读,因此 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);
}

令我惊讶的是,这段代码有效并打印了消息换行和回车。现在我想知道为什么 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.

我想将我的错误流与输入流区分开来,但是使用这种方法它们都变得困惑了!对此有什么想法吗?

最佳答案

为了避免这种情况,您可以使用线程。

就像一个负责读取的从属线程。这不会停止您的计划进度。

关于java - BufferedReader.readLine 阻止我的程序,但 BufferedReader.read() 正确读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27507004/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com