You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by bo...@apache.org on 2017/02/04 19:21:19 UTC
[3/5] commons-compress git commit: BZip2CompressorInputStream: Use
BitInputStream.
BZip2CompressorInputStream: Use BitInputStream.
Project: http://git-wip-us.apache.org/repos/asf/commons-compress/repo
Commit: http://git-wip-us.apache.org/repos/asf/commons-compress/commit/96e34c65
Tree: http://git-wip-us.apache.org/repos/asf/commons-compress/tree/96e34c65
Diff: http://git-wip-us.apache.org/repos/asf/commons-compress/diff/96e34c65
Branch: refs/heads/PR13
Commit: 96e34c6530bd20f4982d9351138a4cfa623fac9e
Parents: 3af95ce
Author: Thomas Meyer <th...@m3y3r.de>
Authored: Sun Jan 15 17:50:13 2017 +0100
Committer: Stefan Bodewig <bo...@apache.org>
Committed: Sat Feb 4 18:56:59 2017 +0100
----------------------------------------------------------------------
.../bzip2/BZip2CompressorInputStream.java | 169 +++++--------------
1 file changed, 45 insertions(+), 124 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/commons-compress/blob/96e34c65/src/main/java/org/apache/commons/compress/compressors/bzip2/BZip2CompressorInputStream.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/commons/compress/compressors/bzip2/BZip2CompressorInputStream.java b/src/main/java/org/apache/commons/compress/compressors/bzip2/BZip2CompressorInputStream.java
index 1fc8146..c1ed68f 100644
--- a/src/main/java/org/apache/commons/compress/compressors/bzip2/BZip2CompressorInputStream.java
+++ b/src/main/java/org/apache/commons/compress/compressors/bzip2/BZip2CompressorInputStream.java
@@ -26,8 +26,11 @@ package org.apache.commons.compress.compressors.bzip2;
import java.io.IOException;
import java.io.InputStream;
+import java.nio.ByteOrder;
+import java.util.Arrays;
import org.apache.commons.compress.compressors.CompressorInputStream;
+import org.apache.commons.compress.utils.BitInputStream;
/**
* An input stream that decompresses from the BZip2 format to be read as any other stream.
@@ -55,13 +58,11 @@ public class BZip2CompressorInputStream extends CompressorInputStream implements
private boolean blockRandomised;
- private int bsBuff;
- private int bsLive;
private final CRC crc = new CRC();
private int nInUse;
- private InputStream in;
+ private BitInputStream bin;
private final boolean decompressConcatenated;
private static final int EOF = 0;
@@ -125,7 +126,7 @@ public class BZip2CompressorInputStream extends CompressorInputStream implements
* if {@code in == null}, the stream content is malformed, or an I/O error occurs.
*/
public BZip2CompressorInputStream(final InputStream in, final boolean decompressConcatenated) throws IOException {
- this.in = in;
+ this.bin = new BitInputStream(in, ByteOrder.BIG_ENDIAN);
this.decompressConcatenated = decompressConcatenated;
init(true);
@@ -134,7 +135,7 @@ public class BZip2CompressorInputStream extends CompressorInputStream implements
@Override
public int read() throws IOException {
- if (this.in != null) {
+ if (this.bin != null) {
final int r = read0();
count(r < 0 ? -1 : 1);
return r;
@@ -160,7 +161,7 @@ public class BZip2CompressorInputStream extends CompressorInputStream implements
throw new IndexOutOfBoundsException("offs(" + offs + ") + len("
+ len + ") > dest.length(" + dest.length + ").");
}
- if (this.in == null) {
+ if (this.bin == null) {
throw new IOException("stream closed");
}
if (len == 0) {
@@ -225,17 +226,26 @@ public class BZip2CompressorInputStream extends CompressorInputStream implements
}
}
+ private int readNextByte(BitInputStream in) throws IOException {
+ long b = in.readBits(8);
+ return (int) b;
+ }
+
private boolean init(final boolean isFirstStream) throws IOException {
- if (null == in) {
+ if (null == bin) {
throw new IOException("No InputStream");
}
- final int magic0 = this.in.read();
+ if(!isFirstStream) {
+ bin.clearBitCache();
+ }
+
+ final int magic0 = readNextByte(this.bin);
if (magic0 == -1 && !isFirstStream) {
return false;
}
- final int magic1 = this.in.read();
- final int magic2 = this.in.read();
+ final int magic1 = readNextByte(this.bin);
+ final int magic2 = readNextByte(this.bin);
if (magic0 != 'B' || magic1 != 'Z' || magic2 != 'h') {
throw new IOException(isFirstStream
@@ -243,14 +253,13 @@ public class BZip2CompressorInputStream extends CompressorInputStream implements
: "Garbage after a valid BZip2 stream");
}
- final int blockSize = this.in.read();
+ final int blockSize = readNextByte(this.bin);
if ((blockSize < '1') || (blockSize > '9')) {
throw new IOException("BZip2 block size is invalid");
}
this.blockSize100k = blockSize - '0';
- this.bsLive = 0;
this.computedCombinedCRC = 0;
return true;
@@ -350,41 +359,31 @@ public class BZip2CompressorInputStream extends CompressorInputStream implements
@Override
public void close() throws IOException {
- final InputStream inShadow = this.in;
+ final BitInputStream inShadow = this.bin;
if (inShadow != null) {
try {
- if (inShadow != System.in) {
- inShadow.close();
- }
+// if (inShadow != System.in) {
+// inShadow.close();
+// }
} finally {
this.data = null;
- this.in = null;
+ this.bin = null;
}
}
}
+ /**
+ * read bits from the input stream
+ * @param n the number of bits to read, must not exceed 32?
+ * @return
+ * @throws IOException
+ */
private int bsR(final int n) throws IOException {
- int bsLiveShadow = this.bsLive;
- int bsBuffShadow = this.bsBuff;
-
- if (bsLiveShadow < n) {
- final InputStream inShadow = this.in;
- do {
- final int thech = inShadow.read();
-
- if (thech < 0) {
- throw new IOException("unexpected end of stream");
- }
-
- bsBuffShadow = (bsBuffShadow << 8) | thech;
- bsLiveShadow += 8;
- } while (bsLiveShadow < n);
-
- this.bsBuff = bsBuffShadow;
+ long thech = bin.readBits(n);
+ if (thech < 0) {
+ throw new IOException("unexpected end of stream");
}
-
- this.bsLive = bsLiveShadow - n;
- return (bsBuffShadow >> (bsLiveShadow - n)) & ((1 << n) - 1);
+ return (int) thech;
}
private boolean bsGetBit() throws IOException {
@@ -396,7 +395,7 @@ public class BZip2CompressorInputStream extends CompressorInputStream implements
}
private int bsGetInt() throws IOException {
- return (((((bsR(8) << 8) | bsR(8)) << 8) | bsR(8)) << 8) | bsR(8);
+ return (int) bsR(32);
}
/**
@@ -456,10 +455,7 @@ public class BZip2CompressorInputStream extends CompressorInputStream implements
}
}
- for (int i = 256; --i >= 0;) {
- inUse[i] = false;
- }
-
+ Arrays.fill(inUse, false);
for (int i = 0; i < 16; i++) {
if ((inUse16 & (1 << i)) != 0) {
final int i16 = i << 4;
@@ -556,7 +552,6 @@ public class BZip2CompressorInputStream extends CompressorInputStream implements
this.origPtr = bsR(24);
recvDecodingTables();
- final InputStream inShadow = this.in;
final Data dataShadow = this.data;
final byte[] ll8 = dataShadow.ll8;
final int[] unzftab = dataShadow.unzftab;
@@ -583,8 +578,6 @@ public class BZip2CompressorInputStream extends CompressorInputStream implements
int groupPos = G_SIZE - 1;
final int eob = this.nInUse + 1;
int nextSym = getAndMoveToFrontDecode0(0);
- int bsBuffShadow = this.bsBuff;
- int bsLiveShadow = this.bsLive;
int lastShadow = -1;
int zt = selector[groupNo] & 0xff;
int[] base_zt = base[zt];
@@ -617,37 +610,10 @@ public class BZip2CompressorInputStream extends CompressorInputStream implements
}
int zn = minLens_zt;
-
- // Inlined:
- // int zvec = bsR(zn);
- while (bsLiveShadow < zn) {
- final int thech = inShadow.read();
- if (thech >= 0) {
- bsBuffShadow = (bsBuffShadow << 8) | thech;
- bsLiveShadow += 8;
- continue;
- }
- throw new IOException("unexpected end of stream");
- }
- int zvec = (bsBuffShadow >> (bsLiveShadow - zn))
- & ((1 << zn) - 1);
- bsLiveShadow -= zn;
-
- while (zvec > limit_zt[zn]) {
+ int zvec = (int) bsR(zn);
+ while(zvec > limit_zt[zn]) {
zn++;
- while (bsLiveShadow < 1) {
- final int thech = inShadow.read();
- if (thech >= 0) {
- bsBuffShadow = (bsBuffShadow << 8) | thech;
- bsLiveShadow += 8;
- continue;
- }
- throw new IOException(
- "unexpected end of stream");
- }
- bsLiveShadow--;
- zvec = (zvec << 1)
- | ((bsBuffShadow >> bsLiveShadow) & 1);
+ zvec = (zvec << 1) | bsR(1);
}
nextSym = perm_zt[zvec - base_zt[zn]];
}
@@ -698,74 +664,29 @@ public class BZip2CompressorInputStream extends CompressorInputStream implements
}
int zn = minLens_zt;
-
- // Inlined:
- // int zvec = bsR(zn);
- while (bsLiveShadow < zn) {
- final int thech = inShadow.read();
- if (thech >= 0) {
- bsBuffShadow = (bsBuffShadow << 8) | thech;
- bsLiveShadow += 8;
- continue;
- }
- throw new IOException("unexpected end of stream");
- }
- int zvec = (bsBuffShadow >> (bsLiveShadow - zn))
- & ((1 << zn) - 1);
- bsLiveShadow -= zn;
-
- while (zvec > limit_zt[zn]) {
+ int zvec = (int) bsR(zn);
+ while(zvec > limit_zt[zn]) {
zn++;
- while (bsLiveShadow < 1) {
- final int thech = inShadow.read();
- if (thech >= 0) {
- bsBuffShadow = (bsBuffShadow << 8) | thech;
- bsLiveShadow += 8;
- continue;
- }
- throw new IOException("unexpected end of stream");
- }
- bsLiveShadow--;
- zvec = (zvec << 1) | ((bsBuffShadow >> bsLiveShadow) & 1);
+ zvec = (zvec << 1) | (int) bsR(1);
}
nextSym = perm_zt[zvec - base_zt[zn]];
}
}
this.last = lastShadow;
- this.bsLive = bsLiveShadow;
- this.bsBuff = bsBuffShadow;
}
private int getAndMoveToFrontDecode0(final int groupNo) throws IOException {
- final InputStream inShadow = this.in;
final Data dataShadow = this.data;
final int zt = dataShadow.selector[groupNo] & 0xff;
final int[] limit_zt = dataShadow.limit[zt];
int zn = dataShadow.minLens[zt];
int zvec = bsR(zn);
- int bsLiveShadow = this.bsLive;
- int bsBuffShadow = this.bsBuff;
-
while (zvec > limit_zt[zn]) {
zn++;
- while (bsLiveShadow < 1) {
- final int thech = inShadow.read();
-
- if (thech >= 0) {
- bsBuffShadow = (bsBuffShadow << 8) | thech;
- bsLiveShadow += 8;
- continue;
- }
- throw new IOException("unexpected end of stream");
- }
- bsLiveShadow--;
- zvec = (zvec << 1) | ((bsBuffShadow >> bsLiveShadow) & 1);
+ zvec = (zvec << 1) | (int) bsR(1);
}
- this.bsLive = bsLiveShadow;
- this.bsBuff = bsBuffShadow;
-
return dataShadow.perm[zt][zvec - dataShadow.base[zt][zn]];
}