ucar.nc2.stream.NcStreamCompression Maven / Gradle / Ivy
The newest version!
/*
* Copyright (c) 1998-2018 John Caron and University Corporation for Atmospheric Research/Unidata
* See LICENSE for license information.
*/
package ucar.nc2.stream;
import java.io.IOException;
import java.io.OutputStream;
/**
* Created by rmay on 8/10/15.
*/
public class NcStreamCompression {
NcStreamProto.Compress type;
Object compressInfo;
private NcStreamCompression(NcStreamProto.Compress type, Object info) {
this.type = type;
this.compressInfo = info;
}
private NcStreamCompression(NcStreamProto.Compress type) {
this(type, null);
}
public static NcStreamCompression none() {
return new NcStreamCompression(NcStreamProto.Compress.NONE);
}
public static NcStreamCompression deflate() {
return deflate(-1);
}
public static NcStreamCompression deflate(int level) {
return new NcStreamCompression(NcStreamProto.Compress.DEFLATE, level);
}
public OutputStream setupStream(OutputStream out, int size)
throws IOException
{
switch (type) {
// For compression (currently deflate) we compress the data, then
// will write the block size, and then data, when the stream is closed.
case DEFLATE:
// limit level to range [-1, 9], where -1 is default deflate setting.
int level = Math.min(Math.max((Integer)compressInfo, -1), 9);
int bufferSize = Math.min(size / 2, 512 * 1024 * 1024);
return new NcStreamCompressedOutputStream(out, bufferSize, level);
default:
System.out.printf(" Unknown compression type %s. Defaulting to none.%n", type);
// In the case of no compression, go ahead and write the block
// size so that the stream is ready for data
case NONE:
NcStream.writeVInt(out, size);
return out;
}
}
}