以下のコードはIOErrorを引き起こします。
sio = StringIO.new
Zlib::GzipWriter.wrap(sio) do |gz|
gz.puts("hoge")
end
sio.rewind
sio.read
# => IOError: not opened for reading (IOError)
これはGzipWriter#wrapのブロックを抜けるときにGzWriter#closeメソッドが呼ばれ、そのメソッド内でStringIOもcloseするからです。
既にclose済みのStringIOに対するreadはできないので、以下のように新たなStringIOオブジェクトを作成すると良いです。
sio = StringIO.new
Zlib::GzipWriter.wrap(sio) do |gz|
gz.puts("hoge")
end
new_sio = StringIO.new(sio)
new_sio.read