Object
InputStream is the basic class for reading zip entries in a zip file. It is possible to create a InputStream object directly, passing the zip file name to the constructor, but more often than not the InputStream will be obtained from a File (perhaps using the ZipFileSystem interface) object for a particular entry in the zip archive.
A InputStream inherits IOExtras::AbstractInputStream in order to provide an IO-like interface for reading from a single zip entry. Beyond methods for mimicking an IO-object it contains the method get_next_entry for iterating through the entries of an archive. get_next_entry returns a Entry object that describes the zip entry the InputStream is currently reading from.
Example that creates a zip archive with ZipOutputStream and reads it back again with a InputStream.
require 'zip' Zip::OutputStream.open("my.zip") do |io| io.put_next_entry("first_entry.txt") io.write "Hello world!" io.put_next_entry("adir/first_entry.txt") io.write "Hello again!" end Zip::InputStream.open("my.zip") do |io| while (entry = io.get_next_entry) puts "Contents of #{entry.name}: '#{io.read}'" end end
java.util.zip.ZipInputStream is the original inspiration for this class.
Opens the indicated zip file. An exception is thrown if the specified offset in the specified filename is not a local zip entry header.
@param context [String||IO||StringIO] file path or IO/StringIO object @param offset [Integer] offset in the IO/StringIO
# File lib/zip/input_stream.rb, line 50 def initialize(context, offset = 0) super() @archive_io = get_io(context, offset) @decompressor = ::Zip::NullDecompressor @current_entry = 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.
# File lib/zip/input_stream.rb, line 94 def open(filename_or_io, offset = 0) zio = self.new(filename_or_io, offset) return zio unless block_given? begin yield zio ensure zio.close if zio end end
# File lib/zip/input_stream.rb, line 57 def close @archive_io.close end
# File lib/zip/input_stream.rb, line 84 def eof @output_buffer.empty? && @decompressor.eof end
Returns a Entry object. It is necessary to call this method on a newly created InputStream before reading from the first entry in the archive. Returns nil when there are no more entries.
# File lib/zip/input_stream.rb, line 65 def get_next_entry @archive_io.seek(@current_entry.next_header_offset, IO::SEEK_SET) if @current_entry open_entry end
# File lib/zip/input_stream.rb, line 130 def get_decompressor case when @current_entry.nil? ::Zip::NullDecompressor when @current_entry.compression_method == ::Zip::Entry::STORED ::Zip::PassThruDecompressor.new(@archive_io, @current_entry.size) when @current_entry.compression_method == ::Zip::Entry::DEFLATED ::Zip::Inflater.new(@archive_io) else raise ZipCompressionMethodError, "Unsupported compression method #{@current_entry.compression_method}" end end
# File lib/zip/input_stream.rb, line 112 def get_io(io_or_file, offset = 0) case io_or_file when IO, StringIO io_or_file else file = ::File.open(io_or_file, 'rb') file.seek(offset, ::IO::SEEK_SET) file end end
# File lib/zip/input_stream.rb, line 148 def input_finished? @decompressor.input_finished? end
Generated with the Darkfish Rdoc Generator 2.