Class LZWInputStream
- java.lang.Object
-
- java.io.InputStream
-
- org.apache.commons.compress.compressors.CompressorInputStream
-
- org.apache.commons.compress.compressors.lzw.LZWInputStream
-
- All Implemented Interfaces:
java.io.Closeable
,java.lang.AutoCloseable
,InputStreamStatistics
- Direct Known Subclasses:
UnshrinkingInputStream
,ZCompressorInputStream
public abstract class LZWInputStream extends CompressorInputStream implements InputStreamStatistics
Generic LZW implementation. It is used internally for the Z decompressor and the Unshrinking Zip file compression method, but may be useful for third-party projects in implementing their own LZW variations.
- Since:
- 1.10
-
-
Field Summary
Fields Modifier and Type Field Description private byte[]
characters
private int
clearCode
private int
codeSize
protected static int
DEFAULT_CODE_SIZE
protected BitInputStream
in
private byte[]
oneByte
private byte[]
outputStack
private int
outputStackLocation
private int[]
prefixes
private int
previousCode
private byte
previousCodeFirstChar
private int
tableSize
protected static int
UNUSED_PREFIX
-
Constructor Summary
Constructors Modifier Constructor Description protected
LZWInputStream(java.io.InputStream inputStream, java.nio.ByteOrder byteOrder)
-
Method Summary
All Methods Instance Methods Abstract Methods Concrete Methods Modifier and Type Method Description protected abstract int
addEntry(int previousCode, byte character)
Add a new entry to the dictionary.protected int
addEntry(int previousCode, byte character, int maxTableSize)
Adds a new entry if the maximum table size hasn't been exceeded and returns the new index.protected int
addRepeatOfPreviousCode()
Add entry for repeat of previousCode we haven't added, yet.void
close()
protected abstract int
decompressNextSymbol()
Read the next code and expand it.protected int
expandCodeToOutputStack(int code, boolean addedUnfinishedEntry)
Expands the entry with index code to the output stack and may create a new entryprotected int
getClearCode()
protected int
getCodeSize()
long
getCompressedCount()
Gets the amount of raw or compressed bytes read by the stream.protected int
getPrefix(int offset)
protected int
getPrefixesLength()
protected int
getTableSize()
protected void
incrementCodeSize()
protected void
initializeTables(int maxCodeSize)
Initializes the arrays based on the maximum code size.protected void
initializeTables(int maxCodeSize, int memoryLimitInKb)
Initializes the arrays based on the maximum code size.int
read()
int
read(byte[] b, int off, int len)
private int
readFromStack(byte[] b, int off, int len)
protected int
readNextCode()
Reads the next code from the stream.protected void
resetCodeSize()
protected void
resetPreviousCode()
protected void
setClearCode(int codeSize)
Sets the clear code based on the code size.protected void
setCodeSize(int cs)
protected void
setPrefix(int offset, int value)
protected void
setTableSize(int newSize)
-
Methods inherited from class org.apache.commons.compress.compressors.CompressorInputStream
count, count, getBytesRead, getCount, getUncompressedCount, pushedBackBytes
-
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
-
Methods inherited from interface org.apache.commons.compress.utils.InputStreamStatistics
getUncompressedCount
-
-
-
-
Field Detail
-
DEFAULT_CODE_SIZE
protected static final int DEFAULT_CODE_SIZE
- See Also:
- Constant Field Values
-
UNUSED_PREFIX
protected static final int UNUSED_PREFIX
- See Also:
- Constant Field Values
-
oneByte
private final byte[] oneByte
-
in
protected final BitInputStream in
-
clearCode
private int clearCode
-
codeSize
private int codeSize
-
previousCodeFirstChar
private byte previousCodeFirstChar
-
previousCode
private int previousCode
-
tableSize
private int tableSize
-
prefixes
private int[] prefixes
-
characters
private byte[] characters
-
outputStack
private byte[] outputStack
-
outputStackLocation
private int outputStackLocation
-
-
Method Detail
-
addEntry
protected abstract int addEntry(int previousCode, byte character) throws java.io.IOException
Add a new entry to the dictionary.- Parameters:
previousCode
- the previous codecharacter
- the next character to append- Returns:
- the new code
- Throws:
java.io.IOException
- on error
-
addEntry
protected int addEntry(int previousCode, byte character, int maxTableSize)
Adds a new entry if the maximum table size hasn't been exceeded and returns the new index.- Parameters:
previousCode
- the previous codecharacter
- the character to appendmaxTableSize
- the maximum table size- Returns:
- the new code or -1 if maxTableSize has been reached already
-
addRepeatOfPreviousCode
protected int addRepeatOfPreviousCode() throws java.io.IOException
Add entry for repeat of previousCode we haven't added, yet.- Returns:
- new code for a repeat of the previous code or -1 if maxTableSize has been reached already
- Throws:
java.io.IOException
- on error
-
close
public void close() throws java.io.IOException
- Specified by:
close
in interfacejava.lang.AutoCloseable
- Specified by:
close
in interfacejava.io.Closeable
- Overrides:
close
in classjava.io.InputStream
- Throws:
java.io.IOException
-
decompressNextSymbol
protected abstract int decompressNextSymbol() throws java.io.IOException
Read the next code and expand it.- Returns:
- the expanded next code, negative on EOF
- Throws:
java.io.IOException
- on error
-
expandCodeToOutputStack
protected int expandCodeToOutputStack(int code, boolean addedUnfinishedEntry) throws java.io.IOException
Expands the entry with index code to the output stack and may create a new entry- Parameters:
code
- the codeaddedUnfinishedEntry
- whether unfinished entries have been added- Returns:
- the new location of the output stack
- Throws:
java.io.IOException
- on error
-
getClearCode
protected int getClearCode()
-
getCodeSize
protected int getCodeSize()
-
getCompressedCount
public long getCompressedCount()
Description copied from interface:InputStreamStatistics
Gets the amount of raw or compressed bytes read by the stream.- Specified by:
getCompressedCount
in interfaceInputStreamStatistics
- Returns:
- the amount of raw or compressed bytes read by the stream.
- Since:
- 1.17
-
getPrefix
protected int getPrefix(int offset)
-
getPrefixesLength
protected int getPrefixesLength()
-
getTableSize
protected int getTableSize()
-
incrementCodeSize
protected void incrementCodeSize()
-
initializeTables
protected void initializeTables(int maxCodeSize)
Initializes the arrays based on the maximum code size.- Parameters:
maxCodeSize
- maximum code size- Throws:
java.lang.IllegalArgumentException
- ifmaxCodeSize
is out of bounds forprefixes
andcharacters
.
-
initializeTables
protected void initializeTables(int maxCodeSize, int memoryLimitInKb) throws MemoryLimitException
Initializes the arrays based on the maximum code size. First checks that the estimated memory usage is below memoryLimitInKb- Parameters:
maxCodeSize
- maximum code sizememoryLimitInKb
- maximum allowed estimated memory usage in Kb- Throws:
MemoryLimitException
- if estimated memory usage is greater than memoryLimitInKbjava.lang.IllegalArgumentException
- ifmaxCodeSize
is not bigger than 0
-
read
public int read() throws java.io.IOException
- Specified by:
read
in classjava.io.InputStream
- Throws:
java.io.IOException
-
read
public int read(byte[] b, int off, int len) throws java.io.IOException
- Overrides:
read
in classjava.io.InputStream
- Throws:
java.io.IOException
-
readFromStack
private int readFromStack(byte[] b, int off, int len)
-
readNextCode
protected int readNextCode() throws java.io.IOException
Reads the next code from the stream.- Returns:
- the next code
- Throws:
java.io.IOException
- on error
-
resetCodeSize
protected void resetCodeSize()
-
resetPreviousCode
protected void resetPreviousCode()
-
setClearCode
protected void setClearCode(int codeSize)
Sets the clear code based on the code size.- Parameters:
codeSize
- code size
-
setCodeSize
protected void setCodeSize(int cs)
-
setPrefix
protected void setPrefix(int offset, int value)
-
setTableSize
protected void setTableSize(int newSize)
-
-