Class: Rant::Archive::Rubyzip::ZipOutputStream
- Includes:
- IOExtras::AbstractOutputStream
- Defined in:
- lib/rant/archive/rubyzip.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
Same as #initialize but if a block is passed the opened stream is passed to the block and closed when the block returns.
Instance Method Summary collapse
-
#<<(data) ⇒ Object
Modeled after IO.<<.
-
#close ⇒ Object
Closes the stream and writes the central directory to the zip file.
- #copy_raw_entry(entry) ⇒ Object
-
#initialize(fileName) ⇒ ZipOutputStream
constructor
Opens the indicated zip file.
-
#put_next_entry(entry, level = Zlib::DEFAULT_COMPRESSION) ⇒ Object
Closes the current entry and opens a new for writing.
Methods included from IOExtras::AbstractOutputStream
#print, #printf, #putc, #puts, #write
Methods included from IOExtras::FakeIO
Constructor Details
#initialize(fileName) ⇒ ZipOutputStream
Opens the indicated zip file. If a file with that name already exists it will be overwritten.
617 618 619 620 621 622 623 624 625 626 |
# File 'lib/rant/archive/rubyzip.rb', line 617 def initialize(fileName) super() @fileName = fileName @outputStream = File.new(@fileName, "wb") @entrySet = ZipEntrySet.new @compressor = NullCompressor.instance @closed = false @currentEntry = nil @comment = nil end |
Instance Attribute Details
#comment ⇒ Object
Returns the value of attribute comment.
613 614 615 |
# File 'lib/rant/archive/rubyzip.rb', line 613 def comment @comment end |
Class Method Details
.open(fileName) ⇒ Object
Same as #initialize but if a block is passed the opened stream is passed to the block and closed when the block returns.
631 632 633 634 635 636 637 |
# File 'lib/rant/archive/rubyzip.rb', line 631 def ZipOutputStream.open(fileName) return new(fileName) unless block_given? zos = new(fileName) yield zos ensure zos.close if zos end |
Instance Method Details
#<<(data) ⇒ Object
Modeled after IO.<<
727 728 729 |
# File 'lib/rant/archive/rubyzip.rb', line 727 def << (data) @compressor << data end |
#close ⇒ Object
Closes the stream and writes the central directory to the zip file
640 641 642 643 644 645 646 647 |
# File 'lib/rant/archive/rubyzip.rb', line 640 def close return if @closed finalize_current_entry update_local_headers write_central_directory @outputStream.close @closed = true end |
#copy_raw_entry(entry) ⇒ Object
658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 |
# File 'lib/rant/archive/rubyzip.rb', line 658 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 @outputStream << entry.get_raw_input_stream { |is| is.seek(src_pos, IO::SEEK_SET) is.read(entry.compressed_size) } @compressor = NullCompressor.instance @currentEntry = nil end |
#put_next_entry(entry, level = Zlib::DEFAULT_COMPRESSION) ⇒ Object
Closes the current entry and opens a new for writing. entry
can be a ZipEntry object or a string.
651 652 653 654 655 656 |
# File 'lib/rant/archive/rubyzip.rb', line 651 def put_next_entry(entry, level = Zlib::DEFAULT_COMPRESSION) raise ZipError, "zip stream is closed" if @closed newEntry = entry.kind_of?(ZipEntry) ? entry : ZipEntry.new(@fileName, entry.to_s) init_next_entry(newEntry) @currentEntry=newEntry end |