Index: src/main/java/org/apache/commons/compress/archivers/ar/ArArchiveInputStream.java
===================================================================
--- src/main/java/org/apache/commons/compress/archivers/ar/ArArchiveInputStream.java	(revision 911785)
+++ src/main/java/org/apache/commons/compress/archivers/ar/ArArchiveInputStream.java	(working copy)
@@ -170,6 +170,10 @@
         return getNextArEntry();
     }
 
+    public boolean canRead(ArchiveEntry entry) {
+        return entry instanceof ArArchiveEntry;
+    }
+
     /*
      * (non-Javadoc)
      * 
Index: src/main/java/org/apache/commons/compress/archivers/zip/ZipArchiveInputStream.java
===================================================================
--- src/main/java/org/apache/commons/compress/archivers/zip/ZipArchiveInputStream.java	(revision 911785)
+++ src/main/java/org/apache/commons/compress/archivers/zip/ZipArchiveInputStream.java	(working copy)
@@ -196,10 +196,15 @@
      * compression method that hasn't been implemented yet.</p>
      * @since Apache Commons Compress 1.1
      */
-    public boolean canRead(ZipArchiveEntry ze) {
-        return !ze.isEncrypted() &&
-            (ze.getMethod() == ZipArchiveEntry.STORED
-             || ze.getMethod() == ZipArchiveEntry.DEFLATED);
+    public boolean canRead(ArchiveEntry entry) {
+        if (entry instanceof ZipArchiveEntry) {
+            ZipArchiveEntry ze = (ZipArchiveEntry) entry;
+            return !ze.isEncrypted() &&
+                (ze.getMethod() == ZipArchiveEntry.STORED
+                 || ze.getMethod() == ZipArchiveEntry.DEFLATED);
+        } else {
+            return false;
+        }
     }
 
     public int read(byte[] buffer, int start, int length) throws IOException {
Index: src/main/java/org/apache/commons/compress/archivers/tar/TarArchiveInputStream.java
===================================================================
--- src/main/java/org/apache/commons/compress/archivers/tar/TarArchiveInputStream.java	(revision 911785)
+++ src/main/java/org/apache/commons/compress/archivers/tar/TarArchiveInputStream.java	(working copy)
@@ -223,6 +223,10 @@
         return getNextTarEntry();
     }
 
+    public boolean canRead(ArchiveEntry entry) {
+        return entry instanceof TarArchiveEntry;
+    }
+
     /**
      * Reads bytes from the current tar archive entry.
      *
Index: src/main/java/org/apache/commons/compress/archivers/cpio/CpioArchiveInputStream.java
===================================================================
--- src/main/java/org/apache/commons/compress/archivers/cpio/CpioArchiveInputStream.java	(revision 911785)
+++ src/main/java/org/apache/commons/compress/archivers/cpio/CpioArchiveInputStream.java	(working copy)
@@ -423,6 +423,10 @@
         return getNextCPIOEntry();
     }
 
+    public boolean canRead(ArchiveEntry entry) {
+        return entry instanceof CpioArchiveEntry;
+    }
+
     /**
      * Checks if the signature matches one of the following magic values:
      * 
Index: src/main/java/org/apache/commons/compress/archivers/ArchiveInputStream.java
===================================================================
--- src/main/java/org/apache/commons/compress/archivers/ArchiveInputStream.java	(revision 911785)
+++ src/main/java/org/apache/commons/compress/archivers/ArchiveInputStream.java	(working copy)
@@ -64,6 +64,20 @@
     // public abstract XXXArchiveEntry getNextXXXEntry() throws IOException;
 
     /**
+     * Checks whether the contents of the given entry can be read from
+     * this stream. Sometimes entries that are encrypted or use unsupported
+     * compression methods can not be successfully read. This method allows
+     * clients to skip reading such entries. This method only looks at the
+     * entry metadata, so it won't detect things like corrupted streams.
+     *
+     * @param entry the entry to check
+     * @return <code>true</code> if the entry can be read from the stream,
+     *         <code>false</code> otherwise
+     * @since Apache Commons Compress 1.1
+     */
+    public abstract boolean canRead(ArchiveEntry entry);
+
+    /**
      * Reads a byte of data. This method will block until enough input is
      * available.
      * 
