如何在Java中处理多个流?

编程入门 行业动态 更新时间:2024-10-10 06:13:34
本文介绍了如何在Java中处理多个流?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述

我正在尝试运行一个进程,并对其输入,输出和错误流进行处理。显而易见的方法是使用类似 select()的东西,但我在Java中唯一可以找到的就是 Selector.select (),它需要频道。似乎无法从 InputStream 或 OutputStream <获取频道 / code>( FileStream 有一个 getChannel()方法,但这对此没有帮助)

I'm trying to run a process and do stuff with its input, output and error streams. The obvious way to do this is to use something like select(), but the only thing I can find in Java that does that is Selector.select(), which takes a Channel. It doesn't appear to be possible to get a Channel from an InputStream or OutputStream (FileStream has a getChannel() method but that doesn't help here)

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

So, instead I wrote some code to poll all the streams:

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返回。

which works, except that it never terminates. When one of the streams reaches end of file, available() returns zero so read() isn't called and we never get the -1 return that would indicate EOF.

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

One solution would be a non-blocking way to detect EOF. I can't see one in the docs anywhere. Alternatively is there a better way of doing what I want to do?

我在这里看到这个问题: 链接文本 虽然它并不完全按照我的意愿行事,但我可能会使用这个想法,为每个流产生单独的线程,以解决我现在遇到的特殊问题。但当然这不是唯一的方法吗?当然必须有一种方法可以从多个流中读取而不使用每个线程?

I see this question here: link text and although it doesn't exactly do what I want, I can probably use that idea, of spawning separate threads for each stream, for the particular problem I have now. But surely that isn't the only way to do it? Surely there must be a way to read from multiple streams without using a thread for each?

推荐答案

如你所说,解决方案<本答案中概述的href =stackoverflow/questions/60302/starting-a-process-with-inherited-stdinstdoutstderr-in-java-6#60578是传统的方式从进程中读取stdout和stderr。每个流的线程是可行的,即使它有点烦人。

As you said, the solution outlined in this Answer is the traditional way of reading both stdout and stderr from a Process. A thread-per-stream is the way to go, even though it is slightly annoying.

更多推荐

如何在Java中处理多个流?

本文发布于:2023-11-26 05:10:52,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1632764.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:多个   如何在   Java

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!