加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

如何让Zlib从Ruby中的S3流解压缩?

发布时间:2020-12-17 02:40:48 所属栏目:百科 来源:网络整理
导读:应该创建 Ruby Zlib :: GzipReader,传递一个类似IO的对象(必须有一个与IO#读取行为相同的读取方法). 我的问题是我无法从AWS :: S3 lib获得这个类似IO的对象. 据我所知,从中获取流的唯一方法是将块传递给S3Object#stream. 我已经尝试过: Zlib::GzipReader.ne
应该创建 Ruby Zlib :: GzipReader,传递一个类似IO的对象(必须有一个与IO#读取行为相同的读取方法).

我的问题是我无法从AWS :: S3 lib获得这个类似IO的对象.
据我所知,从中获取流的唯一方法是将块传递给S3Object#stream.

我已经尝试过:

Zlib::GzipReader.new(AWS::S3::S3Object.stream('file','bucket'))
# Wich gaves me error: undefined method `read' for #<AWS::S3::S3Object::Value:0x000000017cbe78>

有谁知道我怎么能实现它?

解决方法

一个简单的解决方案是将下载的数据写入 StringIO,然后将其读回:

require 'stringio'

io = StringIO.new
io.write AWS::S3::S3Object.value('file','bucket')
io.rewind

gz = Zlib::GzipReader.new(io)
data = gz.read
gz.close

# do something with data ...

更精细的方法是在流仍在下载时开始膨胀压缩数据,这可以通过IO.pipe来实现.有点像这样:

reader,writer = IO.pipe

fork do
  reader.close
  AWS::S3::S3Object.stream('file','bucket') do |chunk|
    writer.write chunk
  end
end

writer.close

gz = Zlib::GzipReader.new(reader)
while line = gz.gets
  # do something with line ...
end

gz.close

您也可以使用Thread而不是fork:

reader,writer = IO.pipe

thread = Thread.new do
  AWS::S3::S3Object.stream('file','bucket') do |chunk|
    writer.write chunk
  end
  writer.close
end

gz = Zlib::GzipReader.new(reader)
while line = gz.gets
  # do something with line
end

gz.close
thread.join

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读