Zlib::GzipReader
像大多数类似于Ruby的IO
类。你有一个open
调用,当你传递一个块时,块将会收到类似于IO
的对象。想想这是在块的持续时间内使用文件或资源进行某些操作的便捷方式。
但这意味着在您的示例中,gz
是一个类似于IO
的对象,并且实际上并不像您期望的那样是gzip文件的内容。你仍然需要read
来达到目的。然后,简单的解决办法是:
g.write(gz.read)
注意,这将读取未压缩的gzip的全部内容到内存中。
如果您真的在做的是从一个文件复制到另一个文件,您可以使用更高效的方法IO.copy_stream
。然后,您的例子可能是这样的:
Zlib::GzipReader.open('PRIDE_Exp_Complete_Ac_1015.xml.gz') do | input_stream |
File.open("PRIDE_Exp_Complete_Ac_1015.xml", "w") do |output_stream|
IO.copy_stream(input_stream, output_stream)
end
end
在幕后,这将尝试使用可用的系统调用sendfile
在Linux上的一些具体情况。否则,它将一次执行快速C代码16KB块的复制。这是我从Ruby 1.9.1源代码中学到的。