Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
  package com.ning.compress.gzip;
  
  import java.io.*;
Optimized variant of java.util.zip.GZIPOutputStream that reuses underlying java.util.zip.Deflater instance}.
 
     extends OutputStream
 {
    
GZIP header magic number; written out LSB like most everything else (i.e. as 0x1f 0x8b)
 
     private final static int GZIP_MAGIC = 0x8b1f;
    
    
For now, static header seems fine, since JDK default gzip writer does it too:
 
     final static byte[] DEFAULT_HEADER = new byte[] {
         (byte,                // Magic number (short)
         (byte)( >> 8),          // Magic number (short)
         .,                // Compression method (CM)
         0,                                // Flags (FLG)
         0,                                // Modification time MTIME (int)
         0,                                // Modification time MTIME (int)
         0,                                // Modification time MTIME (int)
         0,                                // Modification time MTIME (int)
         0,                                // Extra flags (XFLG)
         (byte) 0xff                       // Operating system (OS), UNKNOWN
     };
 
     /*
     ///////////////////////////////////////////////////////////////////////
     // Helper objects
     ///////////////////////////////////////////////////////////////////////
      */
 
     protected Deflater _deflater;
 
     protected final GZIPRecycler _gzipRecycler;
 
     protected final byte[] _eightByteBuffer = new byte[8];
 
     /*
     ///////////////////////////////////////////////////////////////////////
     // State
     ///////////////////////////////////////////////////////////////////////
      */
    
    
Underlying output stream that header, compressed content and footer go to
 
     protected OutputStream _rawOut;
     
     // TODO: write this out, not strictly needed...
     protected DeflaterOutputStream _deflaterOut;
     
     protected CRC32 _crc;
     
     /*
     ///////////////////////////////////////////////////////////////////////
     // Construction
     ///////////////////////////////////////////////////////////////////////
      */
     
     public OptimizedGZIPOutputStream(OutputStream outthrows IOException
     {
         super();
          = GZIPRecycler.instance();
          = out;
         // write header:
         .write();
          = .allocDeflater();
          = new DeflaterOutputStream(, 4000);
          = new CRC32();
     }
     
     /*
     ///////////////////////////////////////////////////////////////////////
     // OutputStream implementation
     ///////////////////////////////////////////////////////////////////////
      */
 
     @Override
     public void close() throws IOException
     {
         .finish();
         _writeTrailer();
         .close();
         Deflater d = ;
         if (d != null) {
              = null;
            .releaseDeflater(d);
        }
    }
    
    @Override
    public void flush() throws IOException {
        .flush();
    }
    
    @Override
    public final void write(byte[] bufthrows IOException {
        write(buf, 0, buf.length);
    }
    
    @Override
    public final void write(int cthrows IOException {
        [0] = (bytec;
        write(, 0, 1);
    }
    
    @Override
    public void write(byte[] bufint offint lenthrows IOException {
        .write(bufofflen);
        .update(bufofflen);
    }
    /*
    ///////////////////////////////////////////////////////////////////////
    // Internal methods
    ///////////////////////////////////////////////////////////////////////
     */
    
    private void _writeTrailer(OutputStream outthrows IOException
    {
        _putInt(, 0, (int.getValue());
        out.write(, 0, 8);
    }
    
    
Stupid GZIP, writes stuff in wrong order (not network, but x86)
    private final static void _putInt(byte[] bufint offsetint value)
    {
        buf[offset++] = (byte) (value);
        buf[offset++] = (byte) (value >> 8);
        buf[offset++] = (byte) (value >> 16);
        buf[offset] = (byte) (value >> 24);
    }
New to GrepCode? Check out our FAQ X