public class BZip2CompressorOutputStream extends java.io.OutputStream implements BZip2Constants
The compression requires large amounts of memory. Thus you should call the
close()
method as soon as possible, to force
BZip2CompressorOutputStream to release the allocated memory.
You can shrink the amount of allocated memory and maybe raise the compression speed by choosing a lower blocksize, which in turn may cause a lower compression ratio. You can avoid unnecessary memory allocation by avoiding using a blocksize which is bigger than the size of the input.
You can compute the memory usage for compressing by the following formula:
<code>400k + (9 * blocksize)</code>.
To get the memory required for decompression by BZip2CompressorInputStream
use
<code>65k + (5 * blocksize)</code>.
Memory usage by blocksize | ||
---|---|---|
Blocksize | Compression memory usage | Decompression memory usage |
100k | 1300k | 565k |
200k | 2200k | 1065k |
300k | 3100k | 1565k |
400k | 4000k | 2065k |
500k | 4900k | 2565k |
600k | 5800k | 3065k |
700k | 6700k | 3565k |
800k | 7600k | 4065k |
900k | 8500k | 4565k |
For decompression BZip2CompressorInputStream allocates less memory if the bzipped input is smaller than one block.
Instances of this class are not threadsafe.
TODO: Update to BZip2 1.0.1
Forked from Apache Commons-Compress with possible changes
Modifier and Type | Class and Description |
---|---|
(package private) static class |
BZip2CompressorOutputStream.Data |
Modifier and Type | Field and Description |
---|---|
private int |
allowableBlockSize |
private int |
blockCRC |
private int |
blockSize100k
Always: in the range 0 ..
|
private BlockSort |
blockSorter |
private int |
bsBuff |
private int |
bsLive |
private int |
combinedCRC |
private CRC |
crc |
private int |
currentChar |
private BZip2CompressorOutputStream.Data |
data
All memory intensive stuff.
|
private static int |
GREATER_ICOST |
private int |
last
Index of the last char in the block, so the block size == last + 1.
|
private static int |
LESSER_ICOST |
static int |
MAX_BLOCKSIZE
The maximum supported blocksize == 9.
|
static int |
MIN_BLOCKSIZE
The minimum supported blocksize == 1.
|
private int |
nInUse |
private int |
nMTF |
private java.io.OutputStream |
out |
private int |
runLength |
BASEBLOCKSIZE, G_SIZE, MAX_ALPHA_SIZE, MAX_CODE_LEN, MAX_SELECTORS, N_GROUPS, N_ITERS, NUM_OVERSHOOT_BYTES, RUNA, RUNB
Constructor and Description |
---|
BZip2CompressorOutputStream(java.io.OutputStream out)
Constructs a new BZip2CompressorOutputStream with a blocksize of 900k.
|
BZip2CompressorOutputStream(java.io.OutputStream out,
int blockSize)
Constructs a new BZip2CompressorOutputStream with specified blocksize.
|
Modifier and Type | Method and Description |
---|---|
private void |
blockSort() |
private void |
bsFinishedWithStream() |
private void |
bsPutInt(int u) |
private void |
bsPutUByte(int c) |
private void |
bsW(int n,
int v) |
static int |
chooseBlockSize(long inputLength)
Chooses a blocksize based on the given length of the data to compress.
|
void |
close() |
private void |
endBlock() |
private void |
endCompression() |
protected void |
finalize()
Overriden to close the stream.
|
void |
finish() |
void |
flush() |
private void |
generateMTFValues() |
int |
getBlockSize()
Returns the blocksize parameter specified at construction time.
|
private static void |
hbAssignCodes(int[] code,
byte[] length,
int minLen,
int maxLen,
int alphaSize) |
private static void |
hbMakeCodeLengths(byte[] len,
int[] freq,
BZip2CompressorOutputStream.Data dat,
int alphaSize,
int maxLen) |
private void |
init()
Writes magic bytes like BZ on the first position of the stream
and bytes indiciating the file-format, which is
huffmanised, followed by a digit indicating blockSize100k.
|
private void |
initBlock() |
private void |
moveToFrontCodeAndSend() |
private void |
sendMTFValues() |
private void |
sendMTFValues0(int nGroups,
int alphaSize) |
private int |
sendMTFValues1(int nGroups,
int alphaSize) |
private void |
sendMTFValues2(int nGroups,
int nSelectors) |
private void |
sendMTFValues3(int nGroups,
int alphaSize) |
private void |
sendMTFValues4() |
private void |
sendMTFValues5(int nGroups,
int nSelectors) |
private void |
sendMTFValues6(int nGroups,
int alphaSize) |
private void |
sendMTFValues7() |
void |
write(byte[] buf,
int offs,
int len) |
void |
write(int b) |
private void |
write0(int b)
Keeps track of the last bytes written and implicitly performs
run-length encoding as the first step of the bzip2 algorithm.
|
private void |
writeRun()
Writes the current byte to the buffer, run-length encoding it
if it has been repeated at least four times (the first step
RLEs sequences of four identical bytes).
|
public static final int MIN_BLOCKSIZE
public static final int MAX_BLOCKSIZE
private static final int GREATER_ICOST
private static final int LESSER_ICOST
private int last
private final int blockSize100k
private int bsBuff
private int bsLive
private final CRC crc
private int nInUse
private int nMTF
private int currentChar
private int runLength
private int blockCRC
private int combinedCRC
private final int allowableBlockSize
private BZip2CompressorOutputStream.Data data
private BlockSort blockSorter
private java.io.OutputStream out
public BZip2CompressorOutputStream(java.io.OutputStream out) throws java.io.IOException
out
- the destination stream.java.io.IOException
- if an I/O error occurs in the specified stream.java.lang.NullPointerException
- if out == null
.public BZip2CompressorOutputStream(java.io.OutputStream out, int blockSize) throws java.io.IOException
out
- the destination stream.blockSize
- the blockSize as 100k units.java.io.IOException
- if an I/O error occurs in the specified stream.java.lang.IllegalArgumentException
- if (blockSize < 1) || (blockSize > 9)
.java.lang.NullPointerException
- if out == null
.MIN_BLOCKSIZE
,
MAX_BLOCKSIZE
private static void hbMakeCodeLengths(byte[] len, int[] freq, BZip2CompressorOutputStream.Data dat, int alphaSize, int maxLen)
public static int chooseBlockSize(long inputLength)
inputLength
- The length of the data which will be compressed by
BZip2CompressorOutputStream.MIN_BLOCKSIZE
and
MAX_BLOCKSIZE
both inclusive. For a negative
inputLength this method returns MAX_BLOCKSIZE
always.public void write(int b) throws java.io.IOException
write
in class java.io.OutputStream
java.io.IOException
private void writeRun() throws java.io.IOException
Flushes the current block before writing data if it is full.
"write to the buffer" means adding to data.buffer starting two steps "after" this.last - initially starting at index 1 (not 0) - and updating this.last to point to the last index written minus 1.
java.io.IOException
protected void finalize() throws java.lang.Throwable
finalize
in class java.lang.Object
java.lang.Throwable
public void finish() throws java.io.IOException
java.io.IOException
public void close() throws java.io.IOException
close
in interface java.io.Closeable
close
in interface java.lang.AutoCloseable
close
in class java.io.OutputStream
java.io.IOException
public void flush() throws java.io.IOException
flush
in interface java.io.Flushable
flush
in class java.io.OutputStream
java.io.IOException
private void init() throws java.io.IOException
java.io.IOException
- if the magic bytes could not been writtenprivate void initBlock()
private void endBlock() throws java.io.IOException
java.io.IOException
private void endCompression() throws java.io.IOException
java.io.IOException
public final int getBlockSize()
public void write(byte[] buf, int offs, int len) throws java.io.IOException
write
in class java.io.OutputStream
java.io.IOException
private void write0(int b) throws java.io.IOException
java.io.IOException
private static void hbAssignCodes(int[] code, byte[] length, int minLen, int maxLen, int alphaSize)
private void bsFinishedWithStream() throws java.io.IOException
java.io.IOException
private void bsW(int n, int v) throws java.io.IOException
java.io.IOException
private void bsPutUByte(int c) throws java.io.IOException
java.io.IOException
private void bsPutInt(int u) throws java.io.IOException
java.io.IOException
private void sendMTFValues() throws java.io.IOException
java.io.IOException
private void sendMTFValues0(int nGroups, int alphaSize)
private int sendMTFValues1(int nGroups, int alphaSize)
private void sendMTFValues2(int nGroups, int nSelectors)
private void sendMTFValues3(int nGroups, int alphaSize)
private void sendMTFValues4() throws java.io.IOException
java.io.IOException
private void sendMTFValues5(int nGroups, int nSelectors) throws java.io.IOException
java.io.IOException
private void sendMTFValues6(int nGroups, int alphaSize) throws java.io.IOException
java.io.IOException
private void sendMTFValues7() throws java.io.IOException
java.io.IOException
private void moveToFrontCodeAndSend() throws java.io.IOException
java.io.IOException
private void blockSort()
private void generateMTFValues()