【问题标题】:java NIO, selectedKeys, and channels for STDIN, STDOUT, STDERR用于 STDIN、STDOUT、STDERR 的 java NIO、selectedKeys 和通道
【发布时间】:2012-08-18 09:12:10
【问题描述】:

我有一个程序通过 Pipe.SourceChannel 将 stdout、stderr 和 stdin 输送到/来自 BytesBuffers。

程序使用选择器注册每个通道。

循环中的程序会周期性地遍历一组 selectedKeys 中的每个键,这些键对应于 stdout、stderr 和 stdin。对于每一个key,它判断key是否有效,是否可读或可写,如果是,则对一个ByteBuffer进行相应的IO操作

我的问题是,当程序开始时,我可以假设一组最初选择的键(对应于 stdin 、 stdout 、 stderr )。

stdin 的密钥是否总是第一个准备好、有效和可读的密钥? 标准输出的密钥能否在标准输入之前准备好、有效且可读?

我问是因为我的程序行为具有随机 IO 行为,而且我猜测我对初始密钥集成员身份的假设是错误的。

提前致谢。

【问题讨论】:

  • @Peter,我的两个问题本来是不同的,我可能没有表达清楚。这里的问题是关于通道变得可读/可写的顺序。您链接到的问题是关于 stdin/stdout/stderr 的通道是否可以在程序执行期间多次打开或关闭。

标签: java nio


【解决方案1】:

当有数据可以在没有阻塞的情况下读取时,通道是可读的。

通道是可写的

【讨论】:

  • 感谢您的回复。我的问题更多是关于程序最初启动时标准输入、标准输出和标准错误的通道变得可读/可写的顺序。从您的评论“当有可以不阻塞地读取的数据时,通道是可读的。”,似乎不能保证可以不阻塞地读取 stdout 或 stderr 的数据的顺序; stdout 可以在 stderr 之前读取,反之亦然。我希望我理解正确。
  • 还回复:“当有数据可以在没有阻塞的情况下读取时,通道是可读的。”,如果 stdout/stdin/stderr 为空怎么办?我发现即使从程序执行开始流是空的,通道本身也是可读的。所以看起来不是必须有数据才能读取?
  • @morfys 我从来没有发现过。 select() 术语中的“可读”定义如上:您可以从通道读取数据或 EOS。如果select() 告诉您频道是可读的并且read() 立即返回零,则说明某处存在严重错误,很可能是您的代码。
  • 澄清一下,我的意思是通道是可读的,read() 立即为 EOS 返回 -1。这种行为正常吗?
  • @morfys 当然。此时您应该关闭频道,以免它继续发生。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-13
  • 2017-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多