【问题标题】:Reopening a stream on a File object在 File 对象上重新打开流
【发布时间】:2012-10-30 01:57:23
【问题描述】:

假设你关闭了一个 ruby​​ File 对象

f = File.open('testfile')
f.close
f.each_byte { ... } #=> IOError: closed stream

我知道您可以通过f = File.open(f) 重新打开流,但是有没有办法通过对象上的IO 方法重新打开流?

例如

f.close
f.open_again
f.each_byte { ... }

【问题讨论】:

  • 我看到了f.reopen,但它看起来不像我想要的。

标签: ruby io


【解决方案1】:

IO#close 文档说:

关闭→无

关闭 ios 并将所有挂起的写入刷新到操作系统。该流不可用于任何进一步的数据操作;如果进行此类尝试,则会引发 IOError。

这意味着您不能再次重新打开 same 流,因为到那时它可能已经关闭了底层文件描述符。

reopen 给你的是,你可以让这个 object 指向另一个流/文件。如果您的 IO 对象绑定到一个常量,但您需要关闭该文件并重新打开另一个文件,这可能会很有用。

【讨论】:

  • 谢谢你,这很好地解释了一切。我会看看我是否可以在我的项目中使用reopen
【解决方案2】:

File 超类IO 提供IO#rewind。这适用于文件等持久资源,但不适用于管道、tty 和套接字等真正的流。

【讨论】:

  • 我在关闭后尝试使用它,它给了我一个IOError: closed stream
  • @mcmullins 当您想再次读取流时,您使用#rewind 而不是 #close。如果你关闭它,你就完成了。
猜你喜欢
  • 2018-01-13
  • 1970-01-01
  • 2014-07-07
  • 1970-01-01
  • 2012-11-16
  • 2015-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多