Ruby 如果不读取IO,如何知道它是否为空?

Ruby 如果不读取IO,如何知道它是否为空?,ruby,io,Ruby,Io,我有一个IO对象(比如$stdout,$stderr)。我可以在上面做read.empty?来查看它是否为空,但是不阅读它就可以知道它是否为空吗?我知道文件有大小,但IO没有 编辑 对不起,如果我的问题不够清楚。我从Open3.popen3获取这些对象作为返回值。例如,我想看看是否有任何内容写入了标准错误。如果可能的话,我不想读它。这是方法的一个目的: 编辑问题后更新的示例: require 'open3' select_timeout = Rational(1,10) # optional

我有一个
IO
对象(比如
$stdout
$stderr
)。我可以在上面做
read.empty?
来查看它是否为空,但是不阅读它就可以知道它是否为空吗?我知道
文件
大小
,但
IO
没有

编辑 对不起,如果我的问题不够清楚。我从
Open3.popen3
获取这些对象作为返回值。例如,我想看看是否有任何内容写入了标准错误。如果可能的话,我不想读它。

这是方法的一个目的:

编辑问题后更新的示例:

require 'open3'

select_timeout = Rational(1,10) # optional

Open3.popen3('ls /') do
  |stdin, stdout, stderr, w_thread|

  rdin, rdout, rderr = IO.select([stdin], [stdout], [stderr], select_timeout)
  if rdin
    p 'no data on standard input' unless rdin.member? stdin
    p 'no data on standard output' unless rdout.member? stdout
    p 'no data on standard error' unless rderr.member? stderr
  else
    p 'none of streams has data available'
  end

  retval = w_thread.value
end
# "no data on standard output"
# "no data on standard error"

虽然只有标准输入包含来自派生线程命令的数据,但这并不重要,
IO::select
可以类似地使用。参见示例更新。