首页 > 解决方案 > 从 IO#pipe 获得的写入流的数据大小

问题描述

我正在使用IO#pipe方法,在某些时候我想知道有多少字节已经写入输出流。使用IO#tell会导致错误,这并没有多大帮助 -Errno::EINVAL: Invalid argument它没有说明什么是无效的。
有一个简单的代码片段来演示这个问题:

read_io, write_io = IO.pipe
write_io.tell #=> #<Errno::EINVAL: Invalid argument>

有没有办法编写我自己的tell方法?或者我做错了什么?

标签: rubyio

解决方案


irb(main):007:0> read_io, write_io = IO.pipe
=> [#<IO:fd 9>, #<IO:fd 10>]
irb(main):008:0> read_io.tell
Errno::ESPIPE: Illegal seek
    from (irb):8:in `tell'
    from (irb):8
    from /usr/bin/irb:11:in `<main>'
irb(main):009:0> write_io.tell
Errno::ESPIPE: Illegal seek
    from (irb):9:in `tell'
    from (irb):9
    from /usr/bin/irb:11:in `<main>'

在我的 Ruby 控制台上,它返回ESPIPEand not EINVAL,这是预期的,因为它是在 Unix 环境中tell实现的,如果文件是pipe则返回。lseekESPIPE

read()我们可以通过保留一个累积管道结果和write()调用的计数器来测量写入/读取到管道的数据量。


推荐阅读