java - 如何在 Java 中处理多个流?

标签 java process io

我正在尝试运行一个进程并对其输入、输出和错误流进行处理。执行此操作的明显方法是使用类似 select() 的方法,但我在 Java 中唯一能找到的方法是 Selector.select(),它需要一个 channel 。似乎不可能从 InputStreamOutputStream 获取 Channel(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);
}

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

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

我在这里看到这个问题: link text 虽然它并不完全符合我的要求,但我可能会使用这个想法,即为每个流生成单独的线程,以解决我现在遇到的特定问题。但这肯定不是唯一的方法吗?肯定有一种方法可以在不为每个流使用线程的情况下从多个流中读取数据吗?

最佳答案

如您所说,解决方案 outlined in this Answer是从进程中读取 stdout 和 stderr 的传统方式。每个流一个线程是可行的方法,尽管它有点烦人。

关于java - 如何在 Java 中处理多个流?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/126138/

相关文章:

c++ - 从文本文件中读取内容,复制它,并放入一个新的文本文件中。 C++

java - 一个亚马逊请求可以发送多少件商品?

javascript - 屏幕截图中没有出现突出显示元素?请

c++ - Waitpid和同步问题

windows - 如何在 Windows 8 中使用 cmd 按进程名称终止程序?

haskell - 如何在 Haskell 中重置标准输入?

java - netbeans freermarker 插件错误 : The plugin Lexer to NetBeans Bridge is requested in implementation version

java - 元数据值中的 resource_type_id 是什么?

Mysql - 实时记录所有查询

java - 如何识别字符串中的 2 个独立的 2 位数字?