【问题标题】:Java external Process error stream readLine() blocks intermittentlyJava 外部进程错误流 readLine() 间歇性阻塞
【发布时间】:2014-05-18 02:54:39
【问题描述】:

我正在对一个外部 Windows 程序进行炮击,该程序通过重复将新行推送到错误流来更新其进度。

命令提示符在运行时看起来像这样:

10% done
10% done
11% done

等等。

因此,我在我的 java 应用程序中取得了一些成功:

Process process = Runtime.getRuntime().exec("my little command");
BufferedReader stdInput = new BufferedReader(new InputStreamReader(process.getInputStream()));
BufferedReader stdError = new BufferedReader(new InputStreamReader(process.getErrorStream()));
String s;
while((s = stdError.readLine())!=null)
{
    System.out.println(s);                  
}

不幸的是,正如您可能已经猜到的那样,存在一些问题。 stdError.readLine() 阻塞,直到错误流中有 +- 4000 字节,然后才在快速会话中打印每一行,然后再次挂起。

我尝试更改 BufferedReader 缓冲区大小,并使用较小长度的 stdError.read(char [] cbuf, int off, int len),但无济于事。

如何解决这个挂起问题?

提前致谢:)

【问题讨论】:

    标签: java process stream blocking runtime.exec


    【解决方案1】:

    stdError.readLine() 阻塞,直到错误流中有 +- 4000 个字节

    不,它没有。只要有一行要读取,它就会返回。

    发生的事情是源进程正在缓冲它的输出,显然是4096字节的块。在 Java 端你无能为力。

    【讨论】:

    • 有意思,怎么在实际的命令提示符下,一直在打印呢?
    • 因为stdio 在输出为终端时不会被缓冲。
    • 问题是,我相信有一种方法,因为存在另一个封闭源程序(用 c++ 编写,如果相关的话),它肯定是有问题的程序的外壳,并且能够提供流畅的进度更新。
    • 所以该程序调用fflush(stderr), 或者可能会执行任何禁用缓冲的操作,而您的则不会。
    猜你喜欢
    • 2014-06-08
    • 1970-01-01
    • 1970-01-01
    • 2018-09-26
    • 2010-11-09
    • 2016-05-20
    • 1970-01-01
    • 2023-03-07
    • 1970-01-01
    相关资源
    最近更新 更多