Class: Zip::OutputStream
- Inherits:
-
Object
- Object
- Zip::OutputStream
- Includes:
- IOExtras::AbstractOutputStream
- Defined in:
- lib/zip/output_stream.rb
Overview
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.
Instance Attribute Summary collapse
-
#comment ⇒ Object
Returns the value of attribute comment.
Class Method Summary collapse
- .open(fileName) ⇒ Object
-
.write_buffer {|zos| ... } ⇒ Object
Same as #open but writes to a filestream instead.
Instance Method Summary collapse
-
#<<(data) ⇒ Object
Modeled after IO.<<.
-
#close ⇒ Object
Closes the stream and writes the central directory to the zip file.
-
#close_buffer ⇒ Object
Closes the stream and writes the central directory to the zip file.
- #copy_raw_entry(entry) ⇒ Object
-
#initialize(fileName, stream = false) ⇒ OutputStream
constructor
Opens the indicated zip file.
-
#put_next_entry(entryname, comment = nil, extra = nil, compression_method = Entry::DEFLATED, level = Zlib::DEFAULT_COMPRESSION) ⇒ Object
entry
can be a ZipEntry object or a string.
Methods included from IOExtras::AbstractOutputStream
#print, #printf, #putc, #puts, #write
Methods included from IOExtras::FakeIO
Constructor Details
#initialize(fileName, stream = false) ⇒ OutputStream
Opens the indicated zip file. If a file with that name already exists it will be overwritten.
27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
# File 'lib/zip/output_stream.rb', line 27 def initialize(fileName, stream=false) super() @fileName = fileName if stream @output_stream = ::StringIO.new else @output_stream = ::File.new(@fileName, "wb") end @entry_set = ::Zip::EntrySet.new @compressor = ::Zip::NullCompressor.instance @closed = false @current_entry = nil @comment = nil end |
Instance Attribute Details
#comment ⇒ Object
Returns the value of attribute comment.
23 24 25 |
# File 'lib/zip/output_stream.rb', line 23 def comment @comment end |
Class Method Details
.open(fileName) ⇒ Object
46 47 48 49 50 51 52 |
# File 'lib/zip/output_stream.rb', line 46 def open(fileName) return new(fileName) unless block_given? zos = new(fileName) yield zos ensure zos.close if zos end |
.write_buffer {|zos| ... } ⇒ Object
Same as #open but writes to a filestream instead
55 56 57 58 59 |
# File 'lib/zip/output_stream.rb', line 55 def write_buffer zos = new('', true) yield zos return zos.close_buffer end |
Instance Method Details
#<<(data) ⇒ Object
Modeled after IO.<<
167 168 169 |
# File 'lib/zip/output_stream.rb', line 167 def << (data) @compressor << data end |
#close ⇒ Object
Closes the stream and writes the central directory to the zip file
63 64 65 66 67 68 69 70 |
# File 'lib/zip/output_stream.rb', line 63 def close return if @closed finalize_current_entry update_local_headers write_central_directory @output_stream.close @closed = true end |
#close_buffer ⇒ Object
Closes the stream and writes the central directory to the zip file
73 74 75 76 77 78 79 80 |
# File 'lib/zip/output_stream.rb', line 73 def close_buffer return @output_stream if @closed finalize_current_entry update_local_headers write_central_directory @closed = true @output_stream end |
#copy_raw_entry(entry) ⇒ Object
100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 |
# File 'lib/zip/output_stream.rb', line 100 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?(Entry) finalize_current_entry @entry_set << entry src_pos = entry.local_entry_offset entry.write_local_entry(@output_stream) @compressor = NullCompressor.instance entry.get_raw_input_stream do |is| is.seek(src_pos, IO::SEEK_SET) IOExtras.copy_stream_n(@output_stream, is, entry.compressed_size) end @compressor = NullCompressor.instance @current_entry = nil end |
#put_next_entry(entryname, comment = nil, extra = nil, compression_method = Entry::DEFLATED, level = Zlib::DEFAULT_COMPRESSION) ⇒ Object
entry
can be a ZipEntry object or a string.
84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 |
# File 'lib/zip/output_stream.rb', line 84 def put_next_entry(entryname, comment = nil, extra = nil, compression_method = Entry::DEFLATED, level = Zlib::DEFAULT_COMPRESSION) raise ZipError, "zip stream is closed" if @closed if entryname.kind_of?(Entry) new_entry = entryname else new_entry = Entry.new(@fileName, entryname.to_s) end new_entry.comment = comment if !comment.nil? if (!extra.nil?) new_entry.extra = ExtraField === extra ? extra : ExtraField.new(extra.to_s) end new_entry.compression_method = compression_method if !compression_method.nil? init_next_entry(new_entry, level) @current_entry = new_entry end |