public class LZMAInputStream extends InputStream
IMPORTANT: In contrast to other classes in this package, this class
reads data from its input stream one byte at a time. If the input stream
is for example FileInputStream
, wrapping it into
BufferedInputStream
tends to improve performance a lot.
This is not automatically done by this class because there may be use
cases where it is desired that this class won't read any bytes past
the end of the LZMA stream.
Even when using BufferedInputStream
, the performance tends
to be worse (maybe 10-20 % slower) than with LZMA2InputStream
or XZInputStream
(when the .xz file contains LZMA2-compressed data).
Modifier and Type | Field and Description |
---|---|
static int |
DICT_SIZE_MAX
Largest dictionary size supported by this implementation.
|
Constructor and Description |
---|
LZMAInputStream(InputStream in)
Creates a new .lzma file format decompressor without
a memory usage limit.
|
LZMAInputStream(InputStream in,
int memoryLimit)
Creates a new .lzma file format decompressor with an optional
memory usage limit.
|
LZMAInputStream(InputStream in,
long uncompSize,
byte propsByte,
int dictSize)
Creates a new input stream that decompresses raw LZMA data (no .lzma
header) from
in . |
LZMAInputStream(InputStream in,
long uncompSize,
byte propsByte,
int dictSize,
byte[] presetDict)
Creates a new input stream that decompresses raw LZMA data (no .lzma
header) from
in optionally with a preset dictionary. |
LZMAInputStream(InputStream in,
long uncompSize,
int lc,
int lp,
int pb,
int dictSize,
byte[] presetDict)
Creates a new input stream that decompresses raw LZMA data (no .lzma
header) from
in optionally with a preset dictionary. |
Modifier and Type | Method and Description |
---|---|
void |
close()
Closes the stream and calls
in.close() . |
static int |
getMemoryUsage(int dictSize,
byte propsByte)
Gets approximate decompressor memory requirements as kibibytes for
the given dictionary size and LZMA properties byte (lc, lp, and pb).
|
static int |
getMemoryUsage(int dictSize,
int lc,
int lp)
Gets approximate decompressor memory requirements as kibibytes for
the given dictionary size, lc, and lp.
|
int |
read()
Decompresses the next byte from this input stream.
|
int |
read(byte[] buf,
int off,
int len)
Decompresses into an array of bytes.
|
available, mark, markSupported, read, reset, skip
public static final int DICT_SIZE_MAX
LZMA allows dictionaries up to one byte less than 4 GiB. This implementation supports only 16 bytes less than 2 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 LZMAInputStream(InputStream in) throws IOException
in
- input stream from which .lzma data is read;
it might be a good idea to wrap it in
BufferedInputStream
, see the
note at the top of this pageCorruptedInputException
- file is corrupt or perhaps not in
the .lzma format at allUnsupportedOptionsException
- dictionary size or uncompressed size is too
big for this implementationEOFException
- file is truncated or perhaps not in
the .lzma format at allIOException
- may be thrown by in
public LZMAInputStream(InputStream in, int memoryLimit) throws IOException
in
- input stream from which .lzma data is read;
it might be a good idea to wrap it in
BufferedInputStream
, see the
note at the top of this pagememoryLimit
- memory usage limit in kibibytes (KiB)
or -1
to impose no
memory usage limitCorruptedInputException
- file is corrupt or perhaps not in
the .lzma format at allUnsupportedOptionsException
- dictionary size or uncompressed size is too
big for this implementationMemoryLimitException
- memory usage limit was exceededEOFException
- file is truncated or perhaps not in
the .lzma format at allIOException
- may be thrown by in
public LZMAInputStream(InputStream in, long uncompSize, byte propsByte, int dictSize) throws IOException
in
.
The caller needs to know if the "end of payload marker (EOPM)" alias "end of stream marker (EOS marker)" alias "end marker" present. If the end marker isn't used, the caller must know the exact uncompressed size of the stream.
The caller also needs to provide the LZMA properties byte that encodes the number of literal context bits (lc), literal position bits (lp), and position bits (pb).
The dictionary size used when compressing is also needed. 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 compressed
data is readuncompSize
- uncompressed size of the LZMA stream or -1
if the end marker is used in the LZMA streampropsByte
- LZMA properties byte that has the encoded
values for literal context bits (lc), literal
position bits (lp), and position bits (pb)dictSize
- dictionary size as bytes, must be in the range
[0
, DICT_SIZE_MAX
]CorruptedInputException
- if propsByte
is invalid or
the first input byte is not 0x00UnsupportedOptionsException
- dictionary size or uncompressed size is too
big for this implementationIOException
public LZMAInputStream(InputStream in, long uncompSize, byte propsByte, int dictSize, byte[] presetDict) throws IOException
in
optionally with a preset dictionary.in
- input stream from which LZMA-compressed
data is readuncompSize
- uncompressed size of the LZMA stream or -1
if the end marker is used in the LZMA streampropsByte
- LZMA properties byte that has the encoded
values for literal context bits (lc), literal
position bits (lp), and position bits (pb)dictSize
- dictionary size as bytes, must be in the range
[0
, DICT_SIZE_MAX
]presetDict
- preset dictionary or null
to use no preset dictionaryCorruptedInputException
- if propsByte
is invalid or
the first input byte is not 0x00UnsupportedOptionsException
- dictionary size or uncompressed size is too
big for this implementationEOFException
- file is truncated or corruptIOException
- may be thrown by in
public LZMAInputStream(InputStream in, long uncompSize, int lc, int lp, int pb, int dictSize, byte[] presetDict) throws IOException
in
optionally with a preset dictionary.in
- input stream from which LZMA-compressed
data is readuncompSize
- uncompressed size of the LZMA stream or -1
if the end marker is used in the LZMA streamlc
- number of literal context bits, must be
in the range [0, 8]lp
- number of literal position bits, must be
in the range [0, 4]pb
- number position bits, must be
in the range [0, 4]dictSize
- dictionary size as bytes, must be in the range
[0
, DICT_SIZE_MAX
]presetDict
- preset dictionary or null
to use no preset dictionaryCorruptedInputException
- if the first input byte is not 0x00EOFException
- file is truncated or corruptIOException
- may be thrown by in
public static int getMemoryUsage(int dictSize, byte propsByte) throws UnsupportedOptionsException, CorruptedInputException
dictSize
- LZMA dictionary size as bytes, should be
in the range [0
,
DICT_SIZE_MAX
]propsByte
- LZMA properties byte that encodes the values
of lc, lp, and pbUnsupportedOptionsException
- if dictSize
is outside
the range [0
,
DICT_SIZE_MAX
]CorruptedInputException
- if propsByte
is invalidpublic static int getMemoryUsage(int dictSize, int lc, int lp)
dictSize
- LZMA dictionary size as bytes, must be
in the range [0
,
DICT_SIZE_MAX
]lc
- number of literal context bits, must be
in the range [0, 8]lp
- number of literal position bits, must be
in the range [0, 4]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 LZMA 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 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.