package ucar.nc2.stream; import java.io.*; import java.util.zip.Deflater; import java.util.zip.DeflaterOutputStream; /** * Created by rmay on 8/13/15. */ public class NcStreamCompressedOutputStream extends DataOutputStream { private OutputStream writer; private DeflaterOutputStream dout; private ByteArrayOutputStream buffer; public NcStreamCompressedOutputStream(OutputStream out, int bufferSize, int level) { super(out); // Save the original out for use when we flush writer = out; // write to an internal buffer, so we can find out the size when // compressed buffer = new ByteArrayOutputStream(bufferSize); dout = new DeflaterOutputStream(buffer, new Deflater(level), 4 * 1024); // Override out to point to our compressed stream this.out = new BufferedOutputStream(dout, 1024 * 1024); } @Override public void flush() throws IOException { // Make sure we flush out our stream out.flush(); // Have to finish the deflater in order to get proper block. dout.finish(); // Grab size of compressed data, write this out and then the block // of compressed data. Set number of bytes written to this value. int compressedSize = buffer.size(); written = compressedSize; written += NcStream.writeVInt(writer, compressedSize); buffer.writeTo(writer); // Reset buffer so that in theory we could continue to write to this // stream. buffer.reset(); } }