Ruby中的Zlib解压缩.gz

我有一个包含 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的类一样.您有一个打开的调用,当您将块传递给它时,该块将接收类似IO的对象.可以想象,这是在块的持续时间内对文件或资源执行某些操作的便捷方式.

但这意味着在您的示例中,gz是一个类似IO的对象,实际上并不是gzip文件内容,正如您所期望的那样.你仍然需要从中读取它才能实现.最简单的解决方案是:

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

在幕后,这将尝试使用Linux上某些特定情况下可用的sendfile系统调用.否则,它将一次以快速C代码16KB块进行复制.我从Ruby 1.9.1源代码中学到了这一点.

相关文章

validates:conclusion,:presence=>true,:inclusion=>{...
一、redis集群搭建redis3.0以前,提供了Sentinel工具来监控各...
分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣...
上一篇博文 ruby传参之引用类型 里边定义了一个方法名 mo...
一编程与编程语言 什么是编程语言? 能够被计算机所识别的表...
Ruby类和对象Ruby是一种完美的面向对象编程语言。面向对象编...