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 2018/04/29 10:11:23 UTC

[1/2] commons-compress git commit: fix whitespace

Repository: commons-compress
Updated Branches:
  refs/heads/master 0daa0c9b6 -> eee4d197d


fix whitespace


Project: http://git-wip-us.apache.org/repos/asf/commons-compress/repo
Commit: http://git-wip-us.apache.org/repos/asf/commons-compress/commit/a5103a8d
Tree: http://git-wip-us.apache.org/repos/asf/commons-compress/tree/a5103a8d
Diff: http://git-wip-us.apache.org/repos/asf/commons-compress/diff/a5103a8d

Branch: refs/heads/master
Commit: a5103a8da17b80fac1e0c671ea143d4a5a6e8962
Parents: 0daa0c9
Author: Stefan Bodewig <bo...@apache.org>
Authored: Sun Apr 29 11:25:28 2018 +0200
Committer: Stefan Bodewig <bo...@apache.org>
Committed: Sun Apr 29 11:25:28 2018 +0200

----------------------------------------------------------------------
 .../org/apache/commons/compress/utils/InputStreamStatistics.java   | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/commons-compress/blob/a5103a8d/src/main/java/org/apache/commons/compress/utils/InputStreamStatistics.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/commons/compress/utils/InputStreamStatistics.java b/src/main/java/org/apache/commons/compress/utils/InputStreamStatistics.java
index b53e6f5..569ab36 100644
--- a/src/main/java/org/apache/commons/compress/utils/InputStreamStatistics.java
+++ b/src/main/java/org/apache/commons/compress/utils/InputStreamStatistics.java
@@ -32,7 +32,7 @@ public interface InputStreamStatistics {
     long getCompressedCount();
 
     /**
-    * @return the amount of decompressed bytes returned by the stream
+     * @return the amount of decompressed bytes returned by the stream
      */
     long getUncompressedCount();
 }


[2/2] commons-compress git commit: COMPRESS-445 make most CompressorInputs implement InputStatistics

Posted by bo...@apache.org.
COMPRESS-445 make most CompressorInputs implement InputStatistics

the sole exception is pack200 which is kind of special anyway


Project: http://git-wip-us.apache.org/repos/asf/commons-compress/repo
Commit: http://git-wip-us.apache.org/repos/asf/commons-compress/commit/eee4d197
Tree: http://git-wip-us.apache.org/repos/asf/commons-compress/tree/eee4d197
Diff: http://git-wip-us.apache.org/repos/asf/commons-compress/diff/eee4d197

Branch: refs/heads/master
Commit: eee4d197d25ad99614cb63445ea71557d6a75c43
Parents: a5103a8
Author: Stefan Bodewig <bo...@apache.org>
Authored: Sun Apr 29 12:09:50 2018 +0200
Committer: Stefan Bodewig <bo...@apache.org>
Committed: Sun Apr 29 12:09:50 2018 +0200

----------------------------------------------------------------------
 src/changes/changes.xml                         |  2 +-
 .../compressors/CompressorInputStream.java      | 16 ++++++++++++
 .../brotli/BrotliCompressorInputStream.java     | 18 +++++++++++---
 .../bzip2/BZip2CompressorInputStream.java       |  8 ------
 .../deflate/DeflateCompressorInputStream.java   | 17 +++++++++++--
 .../Deflate64CompressorInputStream.java         |  8 ------
 .../gzip/GzipCompressorInputStream.java         | 26 ++++++++++++++++----
 .../lz4/FramedLZ4CompressorInputStream.java     | 17 ++++++++++---
 .../AbstractLZ77CompressorInputStream.java      | 17 ++++++++++---
 .../lzma/LZMACompressorInputStream.java         | 19 +++++++++++---
 .../compressors/lzw/LZWInputStream.java         |  8 ------
 .../FramedSnappyCompressorInputStream.java      | 20 +++++++++++++--
 .../compressors/xz/XZCompressorInputStream.java | 22 ++++++++++++++---
 .../zstandard/ZstdCompressorInputStream.java    | 15 +++++++++--
 14 files changed, 161 insertions(+), 52 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/commons-compress/blob/eee4d197/src/changes/changes.xml
----------------------------------------------------------------------
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index b2a65e8..7341f10 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -62,7 +62,7 @@ The <action> type attribute can be add,update,fix,remove.
       </action>
       <action issue="COMPRESS-445" type="update" date="2018-04-22"
               due-to="Andreas Beeker">
-        The streams returned by ZipFile and some other decompressing
+        The streams returned by ZipFile and most other decompressing
         streams now provide information about the number of compressed
         and uncompressed bytes read so far. This may be used to detect
         a ZipBomb if the compression ratio exceeds a certain

http://git-wip-us.apache.org/repos/asf/commons-compress/blob/eee4d197/src/main/java/org/apache/commons/compress/compressors/CompressorInputStream.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/commons/compress/compressors/CompressorInputStream.java b/src/main/java/org/apache/commons/compress/compressors/CompressorInputStream.java
index 8f30860..67de705 100644
--- a/src/main/java/org/apache/commons/compress/compressors/CompressorInputStream.java
+++ b/src/main/java/org/apache/commons/compress/compressors/CompressorInputStream.java
@@ -77,4 +77,20 @@ public abstract class CompressorInputStream extends InputStream {
     public long getBytesRead() {
         return bytesRead;
     }
+
+    /**
+     * Returns the amount of raw or compressed bytes read by the stream.
+     *
+     * <p>This implementation invokes {@link #getBytesRead}.</p>
+     *
+     * <p>Provides half of {@link
+     * org.apache.commons.compress.utils.InputStreamStatistics}
+     * without forcing subclasses to implement the other half.</p>
+     *
+     * @return the amount of decompressed bytes returned by the stream
+     * @since 1.17
+     */
+    public long getUncompressedCount() {
+        return getBytesRead();
+    }
 }

http://git-wip-us.apache.org/repos/asf/commons-compress/blob/eee4d197/src/main/java/org/apache/commons/compress/compressors/brotli/BrotliCompressorInputStream.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/commons/compress/compressors/brotli/BrotliCompressorInputStream.java b/src/main/java/org/apache/commons/compress/compressors/brotli/BrotliCompressorInputStream.java
index 5bb104b..5674cb2 100644
--- a/src/main/java/org/apache/commons/compress/compressors/brotli/BrotliCompressorInputStream.java
+++ b/src/main/java/org/apache/commons/compress/compressors/brotli/BrotliCompressorInputStream.java
@@ -21,7 +21,10 @@ import java.io.IOException;
 import java.io.InputStream;
 
 import org.apache.commons.compress.compressors.CompressorInputStream;
+import org.apache.commons.compress.utils.CountingInputStream;
 import org.apache.commons.compress.utils.IOUtils;
+import org.apache.commons.compress.utils.InputStreamStatistics;
+import org.brotli.dec.BrotliInputStream;
 
 /**
  * {@link CompressorInputStream} implementation to decode Brotli encoded stream.
@@ -29,12 +32,14 @@ import org.apache.commons.compress.utils.IOUtils;
  *
  * @since 1.14
  */
-public class BrotliCompressorInputStream extends CompressorInputStream {
+public class BrotliCompressorInputStream extends CompressorInputStream
+    implements InputStreamStatistics {
 
-    private final org.brotli.dec.BrotliInputStream decIS;
+    private final CountingInputStream countingStream;
+    private final BrotliInputStream decIS;
 
     public BrotliCompressorInputStream(final InputStream in) throws IOException {
-        this.decIS = new org.brotli.dec.BrotliInputStream(in);
+        decIS = new BrotliInputStream(countingStream = new CountingInputStream(in));
     }
 
     @Override
@@ -91,4 +96,11 @@ public class BrotliCompressorInputStream extends CompressorInputStream {
         decIS.reset();
     }
 
+    /**
+     * @since 1.17
+     */
+    @Override
+    public long getCompressedCount() {
+        return countingStream.getBytesRead();
+    }
 }

http://git-wip-us.apache.org/repos/asf/commons-compress/blob/eee4d197/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 54457cf..97f6982 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
@@ -190,14 +190,6 @@ public class BZip2CompressorInputStream extends CompressorInputStream
         return bin.getBytesRead();
     }
 
-    /**
-     * @since 1.17
-     */
-    @Override
-    public long getUncompressedCount() {
-        return getBytesRead();
-    }
-
     private void makeMaps() {
         final boolean[] inUse = this.data.inUse;
         final byte[] seqToUnseq = this.data.seqToUnseq;

http://git-wip-us.apache.org/repos/asf/commons-compress/blob/eee4d197/src/main/java/org/apache/commons/compress/compressors/deflate/DeflateCompressorInputStream.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/commons/compress/compressors/deflate/DeflateCompressorInputStream.java b/src/main/java/org/apache/commons/compress/compressors/deflate/DeflateCompressorInputStream.java
index 789336e..0e07284 100644
--- a/src/main/java/org/apache/commons/compress/compressors/deflate/DeflateCompressorInputStream.java
+++ b/src/main/java/org/apache/commons/compress/compressors/deflate/DeflateCompressorInputStream.java
@@ -24,19 +24,24 @@ import java.util.zip.Inflater;
 import java.util.zip.InflaterInputStream;
 
 import org.apache.commons.compress.compressors.CompressorInputStream;
+import org.apache.commons.compress.utils.CountingInputStream;
 import org.apache.commons.compress.utils.IOUtils;
+import org.apache.commons.compress.utils.InputStreamStatistics;
 
 /**
  * Deflate decompressor.
  * @since 1.9
  */
-public class DeflateCompressorInputStream extends CompressorInputStream {
+public class DeflateCompressorInputStream extends CompressorInputStream
+    implements InputStreamStatistics {
+
     private static final int MAGIC_1 = 0x78;
     private static final int MAGIC_2a = 0x01;
     private static final int MAGIC_2b = 0x5e;
     private static final int MAGIC_2c = 0x9c;
     private static final int MAGIC_2d = 0xda;
 
+    private final CountingInputStream countingStream;
     private final InputStream in;
     private final Inflater inflater;
 
@@ -61,7 +66,7 @@ public class DeflateCompressorInputStream extends CompressorInputStream {
     public DeflateCompressorInputStream(final InputStream inputStream,
                                         final DeflateParameters parameters) {
         inflater = new Inflater(!parameters.withZlibHeader());
-        in = new InflaterInputStream(inputStream, inflater);
+        in = new InflaterInputStream(countingStream = new CountingInputStream(inputStream), inflater);
     }
 
     /** {@inheritDoc} */
@@ -103,6 +108,14 @@ public class DeflateCompressorInputStream extends CompressorInputStream {
     }
 
     /**
+     * @since 1.17
+     */
+    @Override
+    public long getCompressedCount() {
+        return countingStream.getBytesRead();
+    }
+
+    /**
      * Checks if the signature matches what is expected for a zlib / deflated file
      *  with the zlib header.
      *

http://git-wip-us.apache.org/repos/asf/commons-compress/blob/eee4d197/src/main/java/org/apache/commons/compress/compressors/deflate64/Deflate64CompressorInputStream.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/commons/compress/compressors/deflate64/Deflate64CompressorInputStream.java b/src/main/java/org/apache/commons/compress/compressors/deflate64/Deflate64CompressorInputStream.java
index a0efd35..883647b 100644
--- a/src/main/java/org/apache/commons/compress/compressors/deflate64/Deflate64CompressorInputStream.java
+++ b/src/main/java/org/apache/commons/compress/compressors/deflate64/Deflate64CompressorInputStream.java
@@ -110,14 +110,6 @@ public class Deflate64CompressorInputStream extends CompressorInputStream implem
         return compressedBytesRead;
     }
 
-    /**
-     * @since 1.17
-     */
-    @Override
-    public long getUncompressedCount() {
-        return getBytesRead();
-    }
-
     private void closeDecoder() {
         closeQuietly(decoder);
         decoder = null;

http://git-wip-us.apache.org/repos/asf/commons-compress/blob/eee4d197/src/main/java/org/apache/commons/compress/compressors/gzip/GzipCompressorInputStream.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/commons/compress/compressors/gzip/GzipCompressorInputStream.java b/src/main/java/org/apache/commons/compress/compressors/gzip/GzipCompressorInputStream.java
index a63e4ea..9e05f8b 100644
--- a/src/main/java/org/apache/commons/compress/compressors/gzip/GzipCompressorInputStream.java
+++ b/src/main/java/org/apache/commons/compress/compressors/gzip/GzipCompressorInputStream.java
@@ -33,7 +33,9 @@ import java.util.zip.CRC32;
 import org.apache.commons.compress.compressors.CompressorInputStream;
 import org.apache.commons.compress.utils.ByteUtils;
 import org.apache.commons.compress.utils.CharsetNames;
+import org.apache.commons.compress.utils.CountingInputStream;
 import org.apache.commons.compress.utils.IOUtils;
+import org.apache.commons.compress.utils.InputStreamStatistics;
 
 /**
  * Input stream that decompresses .gz files.
@@ -71,7 +73,9 @@ import org.apache.commons.compress.utils.IOUtils;
  *
  * @see "https://tools.ietf.org/html/rfc1952"
  */
-public class GzipCompressorInputStream extends CompressorInputStream {
+public class GzipCompressorInputStream extends CompressorInputStream
+    implements InputStreamStatistics {
+
     // Header flags
     // private static final int FTEXT = 0x01; // Uninteresting for us
     private static final int FHCRC = 0x02;
@@ -80,7 +84,10 @@ public class GzipCompressorInputStream extends CompressorInputStream {
     private static final int FCOMMENT = 0x10;
     private static final int FRESERVED = 0xE0;
 
-    // Compressed input stream, possibly wrapped in a BufferedInputStream
+    private final CountingInputStream countingStream;
+
+    // Compressed input stream, possibly wrapped in a
+    // BufferedInputStream, always wrapped in countingStream above
     private final InputStream in;
 
     // True if decompressing multi member streams.
@@ -147,12 +154,13 @@ public class GzipCompressorInputStream extends CompressorInputStream {
     public GzipCompressorInputStream(final InputStream inputStream,
                                      final boolean decompressConcatenated)
             throws IOException {
+        countingStream = new CountingInputStream(inputStream);
         // Mark support is strictly needed for concatenated files only,
         // but it's simpler if it is always available.
-        if (inputStream.markSupported()) {
-            in = inputStream;
+        if (countingStream.markSupported()) {
+            in = countingStream;
         } else {
-            in = new BufferedInputStream(inputStream);
+            in = new BufferedInputStream(countingStream);
         }
 
         this.decompressConcatenated = decompressConcatenated;
@@ -386,4 +394,12 @@ public class GzipCompressorInputStream extends CompressorInputStream {
             this.in.close();
         }
     }
+
+    /**
+     * @since 1.17
+     */
+    @Override
+    public long getCompressedCount() {
+        return countingStream.getBytesRead();
+    }
 }

http://git-wip-us.apache.org/repos/asf/commons-compress/blob/eee4d197/src/main/java/org/apache/commons/compress/compressors/lz4/FramedLZ4CompressorInputStream.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/commons/compress/compressors/lz4/FramedLZ4CompressorInputStream.java b/src/main/java/org/apache/commons/compress/compressors/lz4/FramedLZ4CompressorInputStream.java
index 050deeb..c4c4f49 100644
--- a/src/main/java/org/apache/commons/compress/compressors/lz4/FramedLZ4CompressorInputStream.java
+++ b/src/main/java/org/apache/commons/compress/compressors/lz4/FramedLZ4CompressorInputStream.java
@@ -26,7 +26,9 @@ import org.apache.commons.compress.compressors.CompressorInputStream;
 import org.apache.commons.compress.utils.BoundedInputStream;
 import org.apache.commons.compress.utils.ByteUtils;
 import org.apache.commons.compress.utils.ChecksumCalculatingInputStream;
+import org.apache.commons.compress.utils.CountingInputStream;
 import org.apache.commons.compress.utils.IOUtils;
+import org.apache.commons.compress.utils.InputStreamStatistics;
 
 /**
  * CompressorInputStream for the LZ4 frame format.
@@ -37,7 +39,8 @@ import org.apache.commons.compress.utils.IOUtils;
  * @since 1.14
  * @NotThreadSafe
  */
-public class FramedLZ4CompressorInputStream extends CompressorInputStream {
+public class FramedLZ4CompressorInputStream extends CompressorInputStream
+    implements InputStreamStatistics {
 
     // used by FramedLZ4CompressorOutputStream as well
     static final byte[] LZ4_SIGNATURE = new byte[] { //NOSONAR
@@ -67,7 +70,7 @@ public class FramedLZ4CompressorInputStream extends CompressorInputStream {
         }
     };
 
-    private final InputStream in;
+    private final CountingInputStream in;
     private final boolean decompressConcatenated;
 
     private boolean expectBlockChecksum;
@@ -109,7 +112,7 @@ public class FramedLZ4CompressorInputStream extends CompressorInputStream {
      * @throws IOException if reading fails
      */
     public FramedLZ4CompressorInputStream(InputStream in, boolean decompressConcatenated) throws IOException {
-        this.in = in;
+        this.in = new CountingInputStream(in);
         this.decompressConcatenated = decompressConcatenated;
         init(true);
     }
@@ -154,6 +157,14 @@ public class FramedLZ4CompressorInputStream extends CompressorInputStream {
         return r;
     }
 
+    /**
+     * @since 1.17
+     */
+    @Override
+    public long getCompressedCount() {
+        return in.getBytesRead();
+    }
+
     private void init(boolean firstFrame) throws IOException {
         if (readSignature(firstFrame)) {
             readFrameDescriptor();

http://git-wip-us.apache.org/repos/asf/commons-compress/blob/eee4d197/src/main/java/org/apache/commons/compress/compressors/lz77support/AbstractLZ77CompressorInputStream.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/commons/compress/compressors/lz77support/AbstractLZ77CompressorInputStream.java b/src/main/java/org/apache/commons/compress/compressors/lz77support/AbstractLZ77CompressorInputStream.java
index 13e5331..8a1371a 100644
--- a/src/main/java/org/apache/commons/compress/compressors/lz77support/AbstractLZ77CompressorInputStream.java
+++ b/src/main/java/org/apache/commons/compress/compressors/lz77support/AbstractLZ77CompressorInputStream.java
@@ -24,7 +24,9 @@ import java.util.Arrays;
 
 import org.apache.commons.compress.compressors.CompressorInputStream;
 import org.apache.commons.compress.utils.ByteUtils;
+import org.apache.commons.compress.utils.CountingInputStream;
 import org.apache.commons.compress.utils.IOUtils;
+import org.apache.commons.compress.utils.InputStreamStatistics;
 
 /**
  * Encapsulates code common to LZ77 decompressors.
@@ -72,7 +74,8 @@ import org.apache.commons.compress.utils.IOUtils;
  *
  * @since 1.14
  */
-public abstract class AbstractLZ77CompressorInputStream extends CompressorInputStream {
+public abstract class AbstractLZ77CompressorInputStream extends CompressorInputStream
+    implements InputStreamStatistics {
 
     /** Size of the window - must be bigger than the biggest offset expected. */
     private final int windowSize;
@@ -94,7 +97,7 @@ public abstract class AbstractLZ77CompressorInputStream extends CompressorInputS
     private int readIndex;
 
     /** The underlying stream to read compressed data from */
-    private final InputStream in;
+    private final CountingInputStream in;
 
     /** Number of bytes still to be read from the current literal or back-reference. */
     private long bytesRemaining;
@@ -129,7 +132,7 @@ public abstract class AbstractLZ77CompressorInputStream extends CompressorInputS
      * @throws IOException if reading fails
      */
     public AbstractLZ77CompressorInputStream(final InputStream is, int windowSize) throws IOException {
-        this.in = is;
+        this.in = new CountingInputStream(is);
         this.windowSize = windowSize;
         buf = new byte[3 * windowSize];
         writeIndex = readIndex = 0;
@@ -187,6 +190,14 @@ public abstract class AbstractLZ77CompressorInputStream extends CompressorInputS
     }
 
     /**
+     * @since 1.17
+     */
+    @Override
+    public long getCompressedCount() {
+        return in.getBytesRead();
+    }
+
+    /**
      * Used by subclasses to signal the next block contains the given
      * amount of literal data.
      * @param length the length of the block

http://git-wip-us.apache.org/repos/asf/commons-compress/blob/eee4d197/src/main/java/org/apache/commons/compress/compressors/lzma/LZMACompressorInputStream.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/commons/compress/compressors/lzma/LZMACompressorInputStream.java b/src/main/java/org/apache/commons/compress/compressors/lzma/LZMACompressorInputStream.java
index 13cc5a2..794e3a5 100644
--- a/src/main/java/org/apache/commons/compress/compressors/lzma/LZMACompressorInputStream.java
+++ b/src/main/java/org/apache/commons/compress/compressors/lzma/LZMACompressorInputStream.java
@@ -25,13 +25,18 @@ import org.apache.commons.compress.MemoryLimitException;
 import org.tukaani.xz.LZMAInputStream;
 
 import org.apache.commons.compress.compressors.CompressorInputStream;
+import org.apache.commons.compress.utils.CountingInputStream;
 import org.apache.commons.compress.utils.IOUtils;
+import org.apache.commons.compress.utils.InputStreamStatistics;
 
 /**
  * LZMA decompressor.
  * @since 1.6
  */
-public class LZMACompressorInputStream extends CompressorInputStream {
+public class LZMACompressorInputStream extends CompressorInputStream
+    implements InputStreamStatistics {
+
+    private final CountingInputStream countingStream;
     private final InputStream in;
 
     /**
@@ -48,7 +53,7 @@ public class LZMACompressorInputStream extends CompressorInputStream {
      */
     public LZMACompressorInputStream(final InputStream inputStream)
             throws IOException {
-        in = new LZMAInputStream(inputStream, -1);
+        in = new LZMAInputStream(countingStream = new CountingInputStream(inputStream), -1);
     }
 
     /**
@@ -71,7 +76,7 @@ public class LZMACompressorInputStream extends CompressorInputStream {
     public LZMACompressorInputStream(final InputStream inputStream, int memoryLimitInKb)
             throws IOException {
         try {
-            in = new LZMAInputStream(inputStream, memoryLimitInKb);
+            in = new LZMAInputStream(countingStream = new CountingInputStream(inputStream), memoryLimitInKb);
         } catch (org.tukaani.xz.MemoryLimitException e) {
             //convert to commons-compress exception
             throw new MemoryLimitException(e.getMemoryNeeded(), e.getMemoryLimit(), e);
@@ -113,6 +118,14 @@ public class LZMACompressorInputStream extends CompressorInputStream {
     }
 
     /**
+     * @since 1.17
+     */
+    @Override
+    public long getCompressedCount() {
+        return countingStream.getBytesRead();
+    }
+
+    /**
      * Checks if the signature matches what is expected for an lzma file.
      *
      * @param signature

http://git-wip-us.apache.org/repos/asf/commons-compress/blob/eee4d197/src/main/java/org/apache/commons/compress/compressors/lzw/LZWInputStream.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/commons/compress/compressors/lzw/LZWInputStream.java b/src/main/java/org/apache/commons/compress/compressors/lzw/LZWInputStream.java
index 9cdf680..a5e512c 100644
--- a/src/main/java/org/apache/commons/compress/compressors/lzw/LZWInputStream.java
+++ b/src/main/java/org/apache/commons/compress/compressors/lzw/LZWInputStream.java
@@ -97,14 +97,6 @@ public abstract class LZWInputStream extends CompressorInputStream implements In
     }
 
     /**
-     * @since 1.17
-     */
-    @Override
-    public long getUncompressedCount() {
-        return getBytesRead();
-    }
-
-    /**
      * Read the next code and expand it.
      * @return the expanded next code
      * @throws IOException on error

http://git-wip-us.apache.org/repos/asf/commons-compress/blob/eee4d197/src/main/java/org/apache/commons/compress/compressors/snappy/FramedSnappyCompressorInputStream.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/commons/compress/compressors/snappy/FramedSnappyCompressorInputStream.java b/src/main/java/org/apache/commons/compress/compressors/snappy/FramedSnappyCompressorInputStream.java
index 56f9294..12974ab 100644
--- a/src/main/java/org/apache/commons/compress/compressors/snappy/FramedSnappyCompressorInputStream.java
+++ b/src/main/java/org/apache/commons/compress/compressors/snappy/FramedSnappyCompressorInputStream.java
@@ -26,7 +26,9 @@ import java.util.Arrays;
 import org.apache.commons.compress.compressors.CompressorInputStream;
 import org.apache.commons.compress.utils.BoundedInputStream;
 import org.apache.commons.compress.utils.ByteUtils;
+import org.apache.commons.compress.utils.CountingInputStream;
 import org.apache.commons.compress.utils.IOUtils;
+import org.apache.commons.compress.utils.InputStreamStatistics;
 
 /**
  * CompressorInputStream for the framing Snappy format.
@@ -36,7 +38,8 @@ import org.apache.commons.compress.utils.IOUtils;
  * @see <a href="https://github.com/google/snappy/blob/master/framing_format.txt">Snappy framing format description</a>
  * @since 1.7
  */
-public class FramedSnappyCompressorInputStream extends CompressorInputStream {
+public class FramedSnappyCompressorInputStream extends CompressorInputStream
+    implements InputStreamStatistics {
 
     /**
      * package private for tests only.
@@ -58,6 +61,9 @@ public class FramedSnappyCompressorInputStream extends CompressorInputStream {
         's', 'N', 'a', 'P', 'p', 'Y'
     };
 
+    private long unreadBytes;
+    private final CountingInputStream countingStream;
+
     /** The underlying stream to read compressed data from */
     private final PushbackInputStream in;
 
@@ -120,7 +126,8 @@ public class FramedSnappyCompressorInputStream extends CompressorInputStream {
                                              final int blockSize,
                                              final FramedSnappyDialect dialect)
         throws IOException {
-        this.in = new PushbackInputStream(in, 1);
+        countingStream = new CountingInputStream(in);
+        this.in = new PushbackInputStream(countingStream, 1);
         this.blockSize = blockSize;
         this.dialect = dialect;
         if (dialect.hasStreamIdentifier()) {
@@ -171,6 +178,14 @@ public class FramedSnappyCompressorInputStream extends CompressorInputStream {
     }
 
     /**
+     * @since 1.17
+     */
+    @Override
+    public long getCompressedCount() {
+        return countingStream.getBytesRead() - unreadBytes;
+    }
+
+    /**
      * Read from the current chunk into the given array.
      *
      * @return -1 if there is no current chunk or the number of bytes
@@ -213,6 +228,7 @@ public class FramedSnappyCompressorInputStream extends CompressorInputStream {
             endReached = true;
         } else if (type == STREAM_IDENTIFIER_TYPE) {
             in.unread(type);
+            unreadBytes++;
             pushedBackBytes(1);
             readStreamIdentifier();
             readNextBlock();

http://git-wip-us.apache.org/repos/asf/commons-compress/blob/eee4d197/src/main/java/org/apache/commons/compress/compressors/xz/XZCompressorInputStream.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/commons/compress/compressors/xz/XZCompressorInputStream.java b/src/main/java/org/apache/commons/compress/compressors/xz/XZCompressorInputStream.java
index 74460cb..20d67a1 100644
--- a/src/main/java/org/apache/commons/compress/compressors/xz/XZCompressorInputStream.java
+++ b/src/main/java/org/apache/commons/compress/compressors/xz/XZCompressorInputStream.java
@@ -21,19 +21,24 @@ package org.apache.commons.compress.compressors.xz;
 import java.io.IOException;
 import java.io.InputStream;
 
-import org.apache.commons.compress.MemoryLimitException;
 import org.tukaani.xz.XZ;
 import org.tukaani.xz.SingleXZInputStream;
 import org.tukaani.xz.XZInputStream;
 
+import org.apache.commons.compress.MemoryLimitException;
 import org.apache.commons.compress.compressors.CompressorInputStream;
+import org.apache.commons.compress.utils.CountingInputStream;
 import org.apache.commons.compress.utils.IOUtils;
+import org.apache.commons.compress.utils.InputStreamStatistics;
 
 /**
  * XZ decompressor.
  * @since 1.4
  */
-public class XZCompressorInputStream extends CompressorInputStream {
+public class XZCompressorInputStream extends CompressorInputStream
+    implements InputStreamStatistics {
+
+    private final CountingInputStream countingStream;
     private final InputStream in;
 
     /**
@@ -123,10 +128,11 @@ public class XZCompressorInputStream extends CompressorInputStream {
     public XZCompressorInputStream(InputStream inputStream,
                                    boolean decompressConcatenated, final int memoryLimitInKb)
             throws IOException {
+        countingStream = new CountingInputStream(inputStream);
         if (decompressConcatenated) {
-            in = new XZInputStream(inputStream, memoryLimitInKb);
+            in = new XZInputStream(countingStream, memoryLimitInKb);
         } else {
-            in = new SingleXZInputStream(inputStream, memoryLimitInKb);
+            in = new SingleXZInputStream(countingStream, memoryLimitInKb);
         }
     }
 
@@ -172,4 +178,12 @@ public class XZCompressorInputStream extends CompressorInputStream {
     public void close() throws IOException {
         in.close();
     }
+
+    /**
+     * @since 1.17
+     */
+    @Override
+    public long getCompressedCount() {
+        return countingStream.getBytesRead();
+    }
 }

http://git-wip-us.apache.org/repos/asf/commons-compress/blob/eee4d197/src/main/java/org/apache/commons/compress/compressors/zstandard/ZstdCompressorInputStream.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/commons/compress/compressors/zstandard/ZstdCompressorInputStream.java b/src/main/java/org/apache/commons/compress/compressors/zstandard/ZstdCompressorInputStream.java
index 01db0ba..7a47f10 100644
--- a/src/main/java/org/apache/commons/compress/compressors/zstandard/ZstdCompressorInputStream.java
+++ b/src/main/java/org/apache/commons/compress/compressors/zstandard/ZstdCompressorInputStream.java
@@ -23,7 +23,9 @@ import java.io.InputStream;
 
 import com.github.luben.zstd.ZstdInputStream;
 import org.apache.commons.compress.compressors.CompressorInputStream;
+import org.apache.commons.compress.utils.CountingInputStream;
 import org.apache.commons.compress.utils.IOUtils;
+import org.apache.commons.compress.utils.InputStreamStatistics;
 
 /**
  * {@link CompressorInputStream} implementation to decode Zstandard encoded stream.
@@ -31,12 +33,14 @@ import org.apache.commons.compress.utils.IOUtils;
  *
  * @since 1.16
  */
-public class ZstdCompressorInputStream extends CompressorInputStream {
+public class ZstdCompressorInputStream extends CompressorInputStream
+    implements InputStreamStatistics {
 
+    private final CountingInputStream countingStream;
     private final ZstdInputStream decIS;
 
     public ZstdCompressorInputStream(final InputStream in) throws IOException {
-        this.decIS = new ZstdInputStream(in);
+        this.decIS = new ZstdInputStream(countingStream = new CountingInputStream(in));
     }
 
     @Override
@@ -93,4 +97,11 @@ public class ZstdCompressorInputStream extends CompressorInputStream {
         decIS.reset();
     }
 
+    /**
+     * @since 1.17
+     */
+    @Override
+    public long getCompressedCount() {
+        return countingStream.getBytesRead();
+    }
 }