class ZipTricks::Streamer::DeflatedWriter

Sends writes to the given `io` compressed using a {Zlib::Deflate}. Also registers data passing through it in a CRC32 checksum calculator. Is made to be completely interchangeable with the StoredWriter in terms of interface.

Constants

CRC32_BUFFER_SIZE

The amount of bytes we will buffer before computing the intermediate CRC32 checksums. Benchmarks show that the optimum is 64KB (see `bench/buffered_crc32_bench.rb), if that is exceeded Zlib is going to perform internal CRC combine calls which will make the speed go down again.

Public Class Methods

new(io) click to toggle source
# File lib/zip_tricks/streamer/deflated_writer.rb, line 13
def initialize(io)
  @compressed_io = io
  @deflater = ::Zlib::Deflate.new(Zlib::DEFAULT_COMPRESSION, -::Zlib::MAX_WBITS)
  @crc = ZipTricks::StreamCRC32.new
  @crc_buf = ZipTricks::WriteBuffer.new(@crc, CRC32_BUFFER_SIZE)
end

Public Instance Methods

<<(data) click to toggle source

Writes the given data into the deflater, and flushes the deflater after having written more than FLUSH_EVERY_N_BYTES bytes of data

@param data data to be written @return self

# File lib/zip_tricks/streamer/deflated_writer.rb, line 25
def <<(data)
  @deflater.deflate(data) { |chunk| @compressed_io << chunk }
  @crc_buf << data
  self
end
finish() click to toggle source

Returns the amount of data received for writing, the amount of compressed data written and the CRC32 checksum. The return value can be directly used as the argument to {Streamer#update_last_entry_and_write_data_descriptor}

@return [Hash] a hash of `{crc32, compressed_size, uncompressed_size}`

# File lib/zip_tricks/streamer/deflated_writer.rb, line 36
def finish
  @compressed_io << @deflater.finish until @deflater.finished?
  @crc_buf.flush
  {crc32: @crc.to_i, compressed_size: @deflater.total_out, uncompressed_size: @deflater.total_in}
ensure
  @deflater.close
end