Ruby中的Zlib解压.gz

Ruby中的Zlib解压.gz,ruby,rubygems,Ruby,Rubygems,我有一个包含XML文档的.gz文件。有人知道如何正确使用Zlib吗?到目前为止,我有以下代码: require 'zlib' Zlib::GzipReader.open('PRIDE_Exp_Complete_Ac_1015.xml.gz') { |gz| g = File.new("PRIDE_Exp_Complete_Ac_1015.xml", "w") g.write(gz) g.close() } 但这会创建一个空白的.xml文档。有人知道我如何正确地做

我有一个包含XML文档的.gz文件。有人知道如何正确使用Zlib吗?到目前为止,我有以下代码:

require 'zlib'
Zlib::GzipReader.open('PRIDE_Exp_Complete_Ac_1015.xml.gz') { |gz|
    g = File.new("PRIDE_Exp_Complete_Ac_1015.xml", "w")
      g.write(gz)
      g.close()
}

但这会创建一个空白的.xml文档。有人知道我如何正确地做到这一点吗?

Zlib::GzipReader
的工作原理与Ruby中的大多数
IO
类似。您有一个
open
调用,当您将一个块传递给它时,该块将接收类似
IO
的对象。想想看,这是一种在块期间使用文件或资源进行操作的便捷方式

但这意味着在您的示例中,
gz
是一个类似于
IO
的对象,而不是您所期望的gzip文件的内容。你仍然需要
从中阅读
,才能做到这一点。最简单的解决方案是:

g.write(gz.read)
请注意,这将把未压缩的gzip的全部内容读入内存

如果您真正要做的只是从一个文件复制到另一个文件,那么可以使用更高效的
IO.copy\u 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
在幕后,这将尝试使用Linux上某些特定情况下可用的
sendfile
syscall。否则,它将一次复制16KB的快速C代码块。这是我从Ruby 1.9.1源代码中学到的。

这里有一个Ruby one liner(cd.git/first和标识任何对象的路径):

ruby-rzlib-e'print Zlib::充气。新建。充气(标准读取)
ruby -rzlib -e 'print Zlib::Inflate.new.inflate(STDIN.read)' < ./74/c757240ec596063af8cd273ebd9f67073e1208