public class LZMA2InputStream extends InputStream
Modifier and Type | Field and Description |
---|---|
static int |
DICT_SIZE_MAX
Largest dictionary size supported by this implementation.
|
static int |
DICT_SIZE_MIN
Smallest valid LZMA2 dictionary size.
|
Constructor and Description |
---|
LZMA2InputStream(InputStream in,
int dictSize)
Creates a new input stream that decompresses raw LZMA2 data
from
in . |
LZMA2InputStream(InputStream in,
int dictSize,
byte[] presetDict)
Creates a new LZMA2 decompressor using a preset dictionary.
|
Modifier and Type | Method and Description |
---|---|
int |
available()
Returns the number of uncompressed bytes that can be read
without blocking.
|
void |
close()
Closes the stream and calls
in.close() . |
static int |
getMemoryUsage(int dictSize)
Gets approximate decompressor memory requirements as kibibytes for
the given dictionary size.
|
int |
read()
Decompresses the next byte from this input stream.
|
int |
read(byte[] buf,
int off,
int len)
Decompresses into an array of bytes.
|
mark, markSupported, read, reset, skip
public static final int DICT_SIZE_MIN
Very tiny dictionaries would be a performance problem, so the minimum is 4 KiB.
public static final int DICT_SIZE_MAX
The LZMA2 algorithm allows dictionaries up to one byte less than 4 GiB. This implementation supports only 16 bytes less than 2 GiB for raw LZMA2 streams, and for .xz files the maximum is 1.5 GiB. This limitation is due to Java using signed 32-bit integers for array indexing. The limitation shouldn't matter much in practice since so huge dictionaries are not normally used.
public LZMA2InputStream(InputStream in, int dictSize)
in
.
The caller needs to know the dictionary size used when compressing; the dictionary size isn't stored as part of a raw LZMA2 stream.
Specifying a too small dictionary size will prevent decompressing the stream. Specifying a too big dictionary is waste of memory but decompression will work.
There is no need to specify a dictionary bigger than the uncompressed size of the data even if a bigger dictionary was used when compressing. If you know the uncompressed size of the data, this might allow saving some memory.
in
- input stream from which LZMA2-compressed
data is readdictSize
- LZMA2 dictionary size as bytes, must be
in the range [DICT_SIZE_MIN
,
DICT_SIZE_MAX
]public LZMA2InputStream(InputStream in, int dictSize, byte[] presetDict)
This is like LZMA2InputStream(InputStream, int)
except
that the dictionary may be initialized using a preset dictionary.
If a preset dictionary was used when compressing the data, the
same preset dictionary must be provided when decompressing.
in
- input stream from which LZMA2-compressed
data is readdictSize
- LZMA2 dictionary size as bytes, must be
in the range [DICT_SIZE_MIN
,
DICT_SIZE_MAX
]presetDict
- preset dictionary or null
to use no preset dictionarypublic static int getMemoryUsage(int dictSize)
dictSize
- LZMA2 dictionary size as bytes, must be
in the range [DICT_SIZE_MIN
,
DICT_SIZE_MAX
]public int read() throws IOException
Reading lots of data with read()
from this input stream
may be inefficient. Wrap it in java.io.BufferedInputStream
if you need to read lots of data one byte at a time.
read
in class InputStream
-1
to indicate the end of the compressed streamCorruptedInputException
XZIOException
- if the stream has been closedEOFException
- compressed input is truncated or corruptIOException
- may be thrown by in
public int read(byte[] buf, int off, int len) throws IOException
If len
is zero, no bytes are read and 0
is returned. Otherwise this will block until len
bytes have been decompressed, the end of the LZMA2 stream is reached,
or an exception is thrown.
read
in class InputStream
buf
- target buffer for uncompressed dataoff
- start offset in buf
len
- maximum number of uncompressed bytes to read-1
to indicate
the end of the compressed streamCorruptedInputException
XZIOException
- if the stream has been closedEOFException
- compressed input is truncated or corruptIOException
- may be thrown by in
public int available() throws IOException
CorruptedInputException
may get
thrown before the number of bytes claimed to be available have
been read from this input stream.
In LZMA2InputStream, the return value will be non-zero when the decompressor is in the middle of an LZMA2 chunk. The return value will then be the number of uncompressed bytes remaining from that chunk.
available
in class InputStream
IOException
public void close() throws IOException
in.close()
.
If the stream was already closed, this does nothing.close
in interface Closeable
close
in interface AutoCloseable
close
in class InputStream
IOException
- if thrown by in.close()
Copyright © 2016 Internet2. All rights reserved.