|
@@ -24,7 +24,6 @@ import static org.apache.hadoop.fs.CommonConfigurationKeysPublic.IO_FILE_BUFFER_
|
|
|
import java.io.IOException;
|
|
|
import java.io.InputStream;
|
|
|
import java.io.OutputStream;
|
|
|
-import java.util.zip.GZIPOutputStream;
|
|
|
|
|
|
import org.apache.hadoop.classification.InterfaceAudience;
|
|
|
import org.apache.hadoop.classification.InterfaceStability;
|
|
@@ -41,101 +40,10 @@ import org.apache.hadoop.io.compress.zlib.ZlibFactory;
|
|
|
@InterfaceAudience.Public
|
|
|
@InterfaceStability.Evolving
|
|
|
public class GzipCodec extends DefaultCodec {
|
|
|
- /**
|
|
|
- * A bridge that wraps around a DeflaterOutputStream to make it
|
|
|
- * a CompressionOutputStream.
|
|
|
- */
|
|
|
- @InterfaceStability.Evolving
|
|
|
- protected static class GzipOutputStream extends CompressorStream {
|
|
|
-
|
|
|
- private static class ResetableGZIPOutputStream extends GZIPOutputStream {
|
|
|
- /**
|
|
|
- * Fixed ten-byte gzip header. See {@link GZIPOutputStream}'s source for
|
|
|
- * details.
|
|
|
- */
|
|
|
- private static final byte[] GZIP_HEADER = new byte[] {
|
|
|
- 0x1f, (byte) 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
|
|
|
-
|
|
|
- private boolean reset = false;
|
|
|
-
|
|
|
- public ResetableGZIPOutputStream(OutputStream out) throws IOException {
|
|
|
- super(out);
|
|
|
- }
|
|
|
-
|
|
|
- public synchronized void resetState() throws IOException {
|
|
|
- reset = true;
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public synchronized void write(byte[] buf, int off, int len)
|
|
|
- throws IOException {
|
|
|
- if (reset) {
|
|
|
- def.reset();
|
|
|
- crc.reset();
|
|
|
- out.write(GZIP_HEADER);
|
|
|
- reset = false;
|
|
|
- }
|
|
|
- super.write(buf, off, len);
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public synchronized void close() throws IOException {
|
|
|
- reset = false;
|
|
|
- super.close();
|
|
|
- }
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- public GzipOutputStream(OutputStream out) throws IOException {
|
|
|
- super(new ResetableGZIPOutputStream(out));
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- * Allow children types to put a different type in here.
|
|
|
- * @param out the Deflater stream to use
|
|
|
- */
|
|
|
- protected GzipOutputStream(CompressorStream out) {
|
|
|
- super(out);
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public void close() throws IOException {
|
|
|
- out.close();
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public void flush() throws IOException {
|
|
|
- out.flush();
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public void write(int b) throws IOException {
|
|
|
- out.write(b);
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public void write(byte[] data, int offset, int length)
|
|
|
- throws IOException {
|
|
|
- out.write(data, offset, length);
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public void finish() throws IOException {
|
|
|
- ((ResetableGZIPOutputStream) out).finish();
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public void resetState() throws IOException {
|
|
|
- ((ResetableGZIPOutputStream) out).resetState();
|
|
|
- }
|
|
|
- }
|
|
|
|
|
|
@Override
|
|
|
public CompressionOutputStream createOutputStream(OutputStream out)
|
|
|
throws IOException {
|
|
|
- if (!ZlibFactory.isNativeZlibLoaded(conf)) {
|
|
|
- return new GzipOutputStream(out);
|
|
|
- }
|
|
|
return CompressionCodec.Util.
|
|
|
createOutputStreamWithCodecPool(this, conf, out);
|
|
|
}
|