Class: Zip::ZipOutputStream

### Home Classes Methods

### In Files

- lib/zip/zip_output_stream.rb

### Parent

Object

### Methods

- ::new
- ::open
- ::write_buffer
- #<<
- #close
- #close_buffer
- #copy_raw_entry
- #finish
- #put_next_entry

### Included Modules

- IOExtras::AbstractOutputStream

### Class/Module Index

Quicksearch

- Zip
- Zip::ZipCentralDirectory
- Zip::ZipCompressionMethodError
- Zip::ZipDestinationFileExistsError
- Zip::ZipEntry
- Zip::ZipEntryExistsError
- Zip::ZipEntryNameError
- Zip::ZipError
- Zip::ZipExtraField
- Zip::ZipExtraField::Generic
- Zip::ZipExtraField::IUnix
- Zip::ZipExtraField::UniversalTime
- Zip::ZipFile
- Zip::ZipFileSystem
- Zip::ZipFileSystem::ZipFsDir
- Zip::ZipFileSystem::ZipFsFile
- Zip::ZipFileSystem::ZipFsFile::ZipFsStat
- Zip::ZipInputStream
- Zip::ZipInternalError
- Zip::ZipOutputStream
- Zip::ZipStreamableDirectory
- Zip::ZipStreamableStream
- IOExtras
- IOExtras::AbstractInputStream
- IOExtras::AbstractOutputStream
- IOExtras::FakeIO
- BugFix
- Object

No matching classes.

# Zip::ZipOutputStream

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.

### Attributes

comment[RW]

### Public Class Methods

new(fileName, stream=false) click to toggle source

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

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

open(fileName) click to toggle source

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

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

write_buffer() click to toggle source

Same as open but writes to a filestream instead

    # File lib/zip/zip_output_stream.rb, line 54
    def ZipOutputStream.write_buffer
      zos = new('', true)
      yield zos
      return zos.close_buffer
    end

### Public Instance Methods

<<(data) click to toggle source

Modeled after IO.<<

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

close() click to toggle source

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

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

close_buffer() click to toggle source

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

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

copy_raw_entry(entry) click to toggle source

    # File lib/zip/zip_output_stream.rb, line 98
    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 do |is|
        is.seek(src_pos, IO::SEEK_SET)
        IOExtras.copy_stream_n(@outputStream, is, entry.compressed_size)
      end
      @compressor = NullCompressor.instance
      @currentEntry = nil
    end

put_next_entry(entryname, comment = nil, extra = nil, compression_method = ZipEntry::DEFLATED, level = Zlib::DEFAULT_COMPRESSION) click to toggle source

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

    # File lib/zip/zip_output_stream.rb, line 82
    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
      if entryname.kind_of?(ZipEntry)
        new_entry = entryname
      else
        new_entry = ZipEntry.new(@fileName, entryname.to_s)
      end
      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 if !compression_method.nil?
      init_next_entry(new_entry, level)
      @currentEntry = new_entry
    end

### Protected Instance Methods

finish() click to toggle source

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

[Validate]

Generated with the Darkfish Rdoc Generator 2.