作者热门文章
- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
Ruby Zlib::GzipReader
应该通过一个类似 IO 的对象来创建(必须有一个与 IO#read
行为相同的读取方法)。
我的问题是我无法从 AWS::S3
库中获取这个类似 IO 的对象。据我所知,从中获取流的唯一方法是将 block 传递给 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 ...
一种更复杂的方法是在流仍在下载时开始膨胀 gzip 数据,这可以通过 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
关于ruby - 如何让 Zlib 从 Ruby 中的 S3 流解压缩?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24016548/
我是一名优秀的程序员,十分优秀!