如何在 Java 中处理多个流?

Mar*_*ker 5 java io process

我正在尝试运行一个进程并对其输入、输出和错误流进行处理。这样做的明显方法是使用类似的东西select(),但我在 Java 中唯一能找到的方法是Selector.select(),它需要一个Channel. 似乎不可能ChannelInputStreamor OutputStream(FileStream有一个 getChannel()方法,但在这里没有帮助)

所以,我写了一些代码来轮询所有的流:

while( !out_eof || !err_eof )
{
    while( out_str.available() )
    {
        if( (bytes = out_str.read(buf)) != -1 )
        {
            // Do something with output stream
        }
        else
            out_eof = true;
    }
    while( err_str.available() )
    {
        if( (bytes = err_str.read(buf)) != -1 )
        {
            // Do something with error stream
        }
        else
            err_eof = true;
    }
    sleep(100);
}
Run Code Online (Sandbox Code Playgroud)

哪个有效,除了它永远不会终止。当其中一个流到达文件末尾时,available()返回零,因此read()不会被调用,我们永远不会得到表示 EOF 的 -1 返回值。

一种解决方案是检测 EOF 的非阻塞方式。我在任何地方的文档中都看不到一个。或者有没有更好的方法来做我想做的事情?

我在这里看到这个问题: 链接文本 ,虽然它并不完全符合我的要求,但我可能会使用这个想法,为每个流生成单独的线程,以解决我现在遇到的特定问题。但这肯定不是唯一的方法吗?当然必须有一种方法可以从多个流中读取,而无需为每个流使用一个线程?

Mat*_*ail 4

正如您所说,本答案中概述的解决方案是从进程读取 stdout 和 stderr 的传统方法。每个流一个线程是可行的方法,尽管它有点烦人。