DeflaterInputStreampublic class DeflaterInputStream extends FilterInputStream Implements an input stream filter for compressing data in the "deflate"
compression format. |
Fields Summary |
---|
protected final Deflater | defCompressor for this stream. | protected final byte[] | bufInput buffer for reading compressed data. | private byte[] | rbufTemporary read buffer. | private boolean | usesDefaultDeflaterDefault compressor is used. | private boolean | reachEOFEnd of the underlying input stream has been reached. |
Constructors Summary |
---|
public DeflaterInputStream(InputStream in)Creates a new input stream with a default compressor and buffer
size.
this(in, new Deflater());
usesDefaultDeflater = true;
| public DeflaterInputStream(InputStream in, Deflater defl)Creates a new input stream with the specified compressor and a
default buffer size.
this(in, defl, 512);
| public DeflaterInputStream(InputStream in, Deflater defl, int bufLen)Creates a new input stream with the specified compressor and buffer
size.
super(in);
// Sanity checks
if (in == null)
throw new NullPointerException("Null input");
if (defl == null)
throw new NullPointerException("Null deflater");
if (bufLen < 1)
throw new IllegalArgumentException("Buffer size < 1");
// Initialize
def = defl;
buf = new byte[bufLen];
|
Methods Summary |
---|
public int | available()Returns 0 after EOF has been reached, otherwise always return 1.
Programs should not count on this method to return the actual number
of bytes that could be read without blocking
ensureOpen();
if (reachEOF) {
return 0;
}
return 1;
| public void | close()Closes this input stream and its underlying input stream, discarding
any pending uncompressed data.
if (in != null) {
try {
// Clean up
if (usesDefaultDeflater) {
def.end();
}
in.close();
} finally {
in = null;
}
}
| private void | ensureOpen()Check to make sure that this stream has not been closed.
if (in == null) {
throw new IOException("Stream closed");
}
| public void | mark(int limit)This operation is not supported.
// Operation not supported
| public boolean | markSupported()Always returns {@code false} because this input stream does not support
the {@link #mark mark()} and {@link #reset reset()} methods.
return false;
| public int | read()Reads a single byte of compressed data from the input stream.
This method will block until some input can be read and compressed.
// Read a single byte of compressed data
int len = read(rbuf, 0, 1);
if (len <= 0)
return -1;
return (rbuf[0] & 0xFF);
| public int | read(byte[] b, int off, int len)Reads compressed data into a byte array.
This method will block until some input can be read and compressed.
// Sanity checks
ensureOpen();
if (b == null) {
throw new NullPointerException("Null buffer for read");
} else if (off < 0 || len < 0 || len > b.length - off) {
throw new IndexOutOfBoundsException();
} else if (len == 0) {
return 0;
}
// Read and compress (deflate) input data bytes
int cnt = 0;
while (len > 0 && !def.finished()) {
int n;
// Read data from the input stream
if (def.needsInput()) {
n = in.read(buf, 0, buf.length);
if (n < 0) {
// End of the input stream reached
def.finish();
} else if (n > 0) {
def.setInput(buf, 0, n);
}
}
// Compress the input data, filling the read buffer
n = def.deflate(b, off, len);
cnt += n;
off += n;
len -= n;
}
if (cnt == 0 && def.finished()) {
reachEOF = true;
cnt = -1;
}
return cnt;
| public void | reset()This operation is not supported.
throw new IOException("mark/reset not supported");
| public long | skip(long n)Skips over and discards data from the input stream.
This method may block until the specified number of bytes are read and
skipped. Note: While {@code n} is given as a {@code long},
the maximum number of bytes which can be skipped is
{@code Integer.MAX_VALUE}.
if (n < 0) {
throw new IllegalArgumentException("negative skip length");
}
ensureOpen();
// Skip bytes by repeatedly decompressing small blocks
if (rbuf.length < 512)
rbuf = new byte[512];
int total = (int)Math.min(n, Integer.MAX_VALUE);
long cnt = 0;
while (total > 0) {
// Read a small block of uncompressed bytes
int len = read(rbuf, 0, (total <= rbuf.length ? total : rbuf.length));
if (len < 0) {
break;
}
cnt += len;
total -= len;
}
return cnt;
|
|