Fix for HARMONY-6394 ([classlib][archive] ZipFile.getInputStream implements available() differently to the RI)
git-svn-id: https://svn.apache.org/repos/asf/harmony/enhanced/classlib/trunk@885602 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/modules/archive/src/main/java/java/util/zip/ZipFile.java b/modules/archive/src/main/java/java/util/zip/ZipFile.java
index 2378fd3..7a412fd 100644
--- a/modules/archive/src/main/java/java/util/zip/ZipFile.java
+++ b/modules/archive/src/main/java/java/util/zip/ZipFile.java
@@ -247,7 +247,8 @@
rafstrm.skip(entry.nameLen + localExtraLenOrWhatever);
rafstrm.mLength = rafstrm.mOffset + entry.compressedSize;
if (entry.compressionMethod == ZipEntry.DEFLATED) {
- return new InflaterInputStream(rafstrm, new Inflater(true));
+ int bufSize = Math.max(1024, (int)Math.min(entry.getSize(), 65535L));
+ return new ZipInflaterInputStream(rafstrm, new Inflater(true), bufSize, entry);
} else {
return rafstrm;
}
@@ -415,4 +416,29 @@
return n;
}
}
+
+ static class ZipInflaterInputStream extends InflaterInputStream {
+
+ ZipEntry entry;
+ long bytesRead = 0;
+
+ public ZipInflaterInputStream(InputStream is, Inflater inf, int bsize, ZipEntry entry) {
+ super(is, inf, bsize);
+ this.entry = entry;
+ }
+
+ @Override
+ public int read(byte[] buffer, int off, int nbytes) throws IOException {
+ int i = super.read(buffer, off, nbytes);
+ if (i != -1) {
+ bytesRead += i;
+ }
+ return i;
+ }
+
+ @Override
+ public int available() throws IOException {
+ return super.available() == 0 ? 0 : (int) (entry.getSize() - bytesRead);
+ }
+ }
}