我正在尝试运行一个进程,并对其输入,输出和错误流进行处理。显而易见的方法是使用类似的东西select()
,但我能在Java中找到的唯一能做到这一点的是Selector.select()
,它需要一个Channel
。似乎没有可能Channel
从一个InputStream
或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);
}
这个可以工作,但它永远不会终止。当其中一个流到达文件末尾时,available()
返回零,因此read()
不会被调用,我们永远不会得到指示EOF的-1返回。
一种解决方案是检测EOF的非阻塞方式。我无法在任何地方看到文档中的一个。或者,有更好的方式做我想做的事情吗?
我可能会使用这个想法,为每个流产生单独的线程,以解决我现在遇到的特殊问题。但当然这不是唯一的方法吗?当然必须有一种方法可以从多个流中读取而不使用每个流程的线程?
发布于 2018-12-18 09:55:53
正如您所说,解决方案是从流程中读取stdout和stderr的传统方法。每个线程的流程是可行的方法,即使它有点麻烦。
https://stackoverflow.com/questions/-100000963
复制相似问题