【问题标题】:Zlib in Ruby to uncompress .gzRuby 中的 Zlib 解压缩 .gz
【发布时间】:2011-03-11 07:23:30
【问题描述】:

我有一个包含 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 文档。有谁知道我该如何正确地做到这一点?

【问题讨论】:

    标签: ruby rubygems


    【解决方案1】:

    Zlib::GzipReader 的工作方式与 Ruby 中的大多数 IO 类类似。您有一个open 调用,当您将一个块传递给它时,该块将收到IO-like 对象。认为这是在块期间对文件或资源执行某些操作的便捷方式。

    但这意味着在您的示例中 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
    

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

    【讨论】:

      【解决方案2】:

      这是一个 Ruby 单线(首先是 cd .git/ 并确定任何对象的路径):

      ruby -rzlib -e 'print Zlib::Inflate.new.inflate(STDIN.read)' < ./74/c757240ec596063af8cd273ebd9f67073e1208
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多