Class: ZipKit::Streamer::DeflatedWriter

Inherits:
Object
  • Object
show all
Includes:
WriteShovel
Defined in:
lib/zip_kit/streamer/deflated_writer.rb

Overview

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.

Constant Summary collapse

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.

64 * 1024

Instance Method Summary collapse

Methods included from WriteShovel

#write

Constructor Details

#initialize(io) ⇒ DeflatedWriter

Returns a new instance of DeflatedWriter.



15
16
17
18
19
20
# File 'lib/zip_kit/streamer/deflated_writer.rb', line 15

def initialize(io)
  @compressed_io = io
  @deflater = ::Zlib::Deflate.new(Zlib::DEFAULT_COMPRESSION, -::Zlib::MAX_WBITS)
  @crc = ZipKit::StreamCRC32.new
  @crc_buf = ZipKit::WriteBuffer.new(@crc, CRC32_BUFFER_SIZE)
end

Instance Method Details

#<<(data) ⇒ Object

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

Parameters:

  • data (String)

    data to be written

Returns:

  • self



27
28
29
30
31
# File 'lib/zip_kit/streamer/deflated_writer.rb', line 27

def <<(data)
  @deflater.deflate(data) { |chunk| @compressed_io << chunk }
  @crc_buf << data
  self
end

#finishHash

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 ZipKit::Streamer#update_last_entry_and_write_data_descriptor

Returns:

  • (Hash)

    a hash of {crc32, compressed_size, uncompressed_size}



38
39
40
41
42
43
44
# File 'lib/zip_kit/streamer/deflated_writer.rb', line 38

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