Ruby中的Zlib解压.gz
我有一个包含XML文档的.gz文件。有人知道如何正确使用Zlib吗?到目前为止,我有以下代码: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文档。有人知道我如何正确地做
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::充气。新建。充气(标准读取)74/c757240ec596063af8cd273ebd9f67073e1208
ruby -rzlib -e 'print Zlib::Inflate.new.inflate(STDIN.read)' < ./74/c757240ec596063af8cd273ebd9f67073e1208