Class Zip::ZipOutputStream
In: lib/zip/zip.rb
Parent: Object

ZipOutputStream is the basic class for writing zip files. It is possible to create a ZipOutputStream object directly, passing the zip file name to the constructor, but more often than not the ZipOutputStream will be obtained from a ZipFile (perhaps using the ZipFileSystem interface) object for a particular entry in the zip archive.

A ZipOutputStream inherits IOExtras::AbstractOutputStream in order to provide an IO-like interface for writing to a single zip entry. Beyond methods for mimicking an IO-object it contains the method put_next_entry that closes the current entry and creates a new.

Please refer to ZipInputStream for example code.

java.util.zip.ZipOutputStream is the original inspiration for this class.

Methods

<<   close   copy_raw_entry   finish   new   open   put_next_entry  

Included Modules

IOExtras::AbstractOutputStream

Attributes

comment  [RW] 

Public Class methods

Opens the indicated zip file. If a file with that name already exists it will be overwritten.

[Source]

# File lib/zip/zip.rb, line 946
    def initialize(fileName)
      super()
      @fileName = fileName
      @outputStream = File.new(@fileName, "wb")
      @entrySet = ZipEntrySet.new
      @compressor = NullCompressor.instance
      @closed = false
      @currentEntry = nil
      @comment = nil
    end

Same as initialize but if a block is passed the opened stream is passed to the block and closed when the block returns.

[Source]

# File lib/zip/zip.rb, line 960
    def ZipOutputStream.open(fileName)
      return new(fileName) unless block_given?
      zos = new(fileName)
      yield zos
    ensure
      zos.close if zos
    end

Public Instance methods

Modeled after IO.<<

[Source]

# File lib/zip/zip.rb, line 1061
    def << (data)
      @compressor << data
    end

Closes the stream and writes the central directory to the zip file

[Source]

# File lib/zip/zip.rb, line 969
    def close
      return if @closed
      finalize_current_entry
      update_local_headers
      write_central_directory
      @outputStream.close
      @closed = true
    end

[Source]

# File lib/zip/zip.rb, line 992
    def copy_raw_entry(entry)
      entry = entry.dup
      raise ZipError, "zip stream is closed" if @closed
      raise ZipError, "entry is not a ZipEntry" if !entry.kind_of?(ZipEntry)
      finalize_current_entry
      @entrySet << entry
      src_pos = entry.local_entry_offset
      entry.write_local_entry(@outputStream)
      @compressor = NullCompressor.instance
      entry.get_raw_input_stream { 
        |is| 
        is.seek(src_pos, IO::SEEK_SET)
        IOExtras.copy_stream_n(@outputStream, is, entry.compressed_size)
      }
      @compressor = NullCompressor.instance
      @currentEntry = nil
    end

Closes the current entry and opens a new for writing. entry can be a ZipEntry object or a string.

[Source]

# File lib/zip/zip.rb, line 980
    def put_next_entry(entryname, comment = nil, extra = nil, compression_method = ZipEntry::DEFLATED,  level = Zlib::DEFAULT_COMPRESSION)
      raise ZipError, "zip stream is closed" if @closed
      new_entry = ZipEntry.new(@fileName, entryname.to_s)
      new_entry.comment = comment if !comment.nil?
      if (!extra.nil?)
        new_entry.extra = ZipExtraField === extra ? extra : ZipExtraField.new(extra.to_s)
      end
      new_entry.compression_method = compression_method
      init_next_entry(new_entry, level)
      @currentEntry = new_entry
    end

Protected Instance methods

[Source]

# File lib/zip/zip.rb, line 1055
    def finish
      @compressor.finish
    end

[Validate]