// package net.sf.zipme; class DeflaterOutputStream { /** * Deflates everything in the def's input buffers. This will call * <code>def.deflate()</code> until all bytes from the input buffers * are processed. */ protected void deflate() throws IOException { while (!def.needsInput()) { int len=def.deflate(buf,0,buf.length); if (len <= 0) break; out.write(buf,0,len); } if (!def.needsInput()) throw new Error("Can't deflate all input?"); } /** * Flushes the stream by calling flush() on the deflater and then * on the underlying stream. This ensures that all bytes are * flushed. This function doesn't work in Sun's JDK, but only in * jazzlib. */ public void flush() throws IOException { def.flush(); deflate(); out.flush(); } /** * Finishes the stream by calling finish() on the deflater. This * was the only way to ensure that all bytes are flushed in Sun's * JDK. */ public void finish() throws IOException { def.finish(); while (!def.finished()) { int len=def.deflate(buf,0,buf.length); if (len <= 0) break; out.write(buf,0,len); } if (!def.finished()) throw new Error("Can't deflate all input?"); out.flush(); } /** * Calls finish() and closes the stream. */ public void close() throws IOException { finish(); out.close(); } /** * Writes a single byte to the compressed output stream. * @param bval the byte value. */ public void write( int bval) throws IOException { byte[] b=new byte[1]; b[0]=(byte)bval; write(b,0,1); } /** * This method writes all the bytes in the specified array to the underlying * <code>OutputStream</code>. It does this by calling the three parameter * version of this method - <code>write(byte[], int, int)</code> in this * class instead of writing to the underlying <code>OutputStream</code> * directly. This allows most subclasses to avoid overriding this method. * @param buf The byte array to write bytes from * @exception IOException If an error occurs */ public void write( byte[] buf) throws IOException { write(buf,0,buf.length); } /** * Writes a len bytes from an array to the compressed stream. * @param buf the byte array. * @param off the offset into the byte array where to start. * @param len the number of bytes to write. */ public void write( byte[] buf, int off, int len) throws IOException { def.setInput(buf,off,len); deflate(); } }