我有一个包含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()
}
Run Code Online (Sandbox Code Playgroud)
但是这会创建一个空白的.xml文档.有谁知道我怎么能正确地做到这一点?
Sté*_*hen 23
Zlib::GzipReader就像IORuby中的大多数类一样.你有一个open调用,当你传递一个块时,该块将接收一个类似IO的对象.可以想象,这是在块的持续时间内对文件或资源执行某些操作的便捷方式.
但这意味着在您的示例中gz是一个IO类似对象,而实际上并不是您所期望的gzip文件的内容.你仍然需要read从中获得它.最简单的解决方案是:
g.write(gz.read)
Run Code Online (Sandbox Code Playgroud)
请注意,这会将未压缩的 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
Run Code Online (Sandbox Code Playgroud)
在幕后,这将尝试使用sendfileLinux上某些特定情况下可用的系统调用.否则,它将一次以快速C代码16KB块进行复制.这是我从Ruby 1.9.1源代码中学到的.