001: /*
002: * Licensed to the Apache Software Foundation (ASF) under one or more
003: * contributor license agreements. See the NOTICE file distributed with
004: * this work for additional information regarding copyright ownership.
005: * The ASF licenses this file to You under the Apache License, Version 2.0
006: * (the "License"); you may not use this file except in compliance with
007: * the License. You may obtain a copy of the License at
008: *
009: * http://www.apache.org/licenses/LICENSE-2.0
010: *
011: * Unless required by applicable law or agreed to in writing, software
012: * distributed under the License is distributed on an "AS IS" BASIS,
013: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014: * See the License for the specific language governing permissions and
015: * limitations under the License.
016: */
017:
018: package java.util.zip;
019:
020: import java.io.IOException;
021: import java.io.OutputStream;
022:
023: /**
024: * The GZIPOutputStream class is used to write data to a stream in the GZIP
025: * storage format.
026: */
027: public class GZIPOutputStream extends DeflaterOutputStream {
028:
029: protected CRC32 crc = new CRC32();
030:
031: /**
032: * Construct a new GZIPOutputStream to write data in GZIP format to the
033: * underlying stream.
034: *
035: * @param os
036: * OutputStream to write to
037: * @throws IOException
038: * if an IO error occurs writing to the output stream
039: */
040: public GZIPOutputStream(OutputStream os) throws IOException {
041: this (os, BUF_SIZE);
042: }
043:
044: /**
045: * Construct a new GZIPOutputStream to write data in GZIP format to the
046: * underlying stream. Set the internal compression buffer to sise size.
047: *
048: * @param os
049: * OutputStream to write to
050: * @param size
051: * Internal buffer size
052: * @throws IOException
053: * if an IO error occurs writing to the output stream
054: */
055: public GZIPOutputStream(OutputStream os, int size)
056: throws IOException {
057: super (os, new Deflater(Deflater.DEFAULT_COMPRESSION, true),
058: size);
059: writeShort(GZIPInputStream.GZIP_MAGIC);
060: out.write(Deflater.DEFLATED);
061: out.write(0); // flags
062: writeLong(0); // mod time
063: out.write(0); // extra flags
064: out.write(0); // operating system
065: }
066:
067: /**
068: * Indicates to the stream that all data has been written out, and any GZIP
069: * terminal data can now be output.
070: */
071: @Override
072: public void finish() throws IOException {
073: super .finish();
074: writeLong(crc.getValue());
075: writeLong(crc.tbytes);
076: }
077:
078: /**
079: * Write up to nbytes of data from the given buffer, starting at offset off,
080: * to the underlying stream in GZIP format.
081: */
082: @Override
083: public void write(byte[] buffer, int off, int nbytes)
084: throws IOException {
085: super .write(buffer, off, nbytes);
086: crc.update(buffer, off, nbytes);
087: }
088:
089: private long writeLong(long i) throws IOException {
090: // Write out the long value as an unsigned int
091: out.write((int) (i & 0xFF));
092: out.write((int) (i >> 8) & 0xFF);
093: out.write((int) (i >> 16) & 0xFF);
094: out.write((int) (i >> 24) & 0xFF);
095: return i;
096: }
097:
098: private int writeShort(int i) throws IOException {
099: out.write(i & 0xFF);
100: out.write((i >> 8) & 0xFF);
101: return i;
102: }
103: }
|