Index: src/main/java/org/apache/commons/compress/archivers/ArchiveStreamFactory.java
===================================================================
--- src/main/java/org/apache/commons/compress/archivers/ArchiveStreamFactory.java	(revision 1659953)
+++ src/main/java/org/apache/commons/compress/archivers/ArchiveStreamFactory.java	(working copy)
@@ -116,12 +116,30 @@
      */
     public static final String SEVEN_Z = "7z";
 
+    private final String encoding;
+
     /**
      * Entry encoding, null for the default.
      */
     private String entryEncoding = null;
 
+    public ArchiveStreamFactory() {
+        this(null);
+    }
+    
     /**
+     * Create an instance using the specified encoding.
+     *
+     * @param encoding the encoding to be used.
+     *
+     * @since 1.10
+     */
+    public ArchiveStreamFactory(String encoding) {
+        super();
+        this.encoding = encoding;
+    }
+
+    /**
      * Returns the encoding to use for arj, zip, dump, cpio and tar
      * files, or null for the default.
      *
@@ -129,7 +147,7 @@
      * @since 1.5
      */
     public String getEntryEncoding() {
-        return entryEncoding;
+        return (encoding != null) ? encoding : entryEncoding;
     }
 
     /**
@@ -137,8 +155,13 @@
      * 
      * @param entryEncoding the entry encoding, null uses the default.
      * @since 1.5
+     * @deprecated 1.10 use {@link #ArchiveStreamFactory(String)} to specify the encoding
      */
+    @Deprecated
     public void setEntryEncoding(String entryEncoding) {
+        if (encoding != null) {
+            throw new IllegalStateException("Cannot overide encoding set by the constructor");
+        }
         this.entryEncoding = entryEncoding;
     }
 
@@ -169,22 +192,22 @@
             return new ArArchiveInputStream(in);
         }
         if (ARJ.equalsIgnoreCase(archiverName)) {
-            if (entryEncoding != null) {
-                return new ArjArchiveInputStream(in, entryEncoding);
+            if (getEntryEncoding() != null) {
+                return new ArjArchiveInputStream(in, getEntryEncoding());
             } else {
                 return new ArjArchiveInputStream(in);
             }
         }
         if (ZIP.equalsIgnoreCase(archiverName)) {
-            if (entryEncoding != null) {
-                return new ZipArchiveInputStream(in, entryEncoding);
+            if (getEntryEncoding() != null) {
+                return new ZipArchiveInputStream(in, getEntryEncoding());
             } else {
                 return new ZipArchiveInputStream(in);
             }
         }
         if (TAR.equalsIgnoreCase(archiverName)) {
-            if (entryEncoding != null) {
-                return new TarArchiveInputStream(in, entryEncoding);
+            if (getEntryEncoding() != null) {
+                return new TarArchiveInputStream(in, getEntryEncoding());
             } else {
                 return new TarArchiveInputStream(in);
             }
@@ -193,15 +216,15 @@
             return new JarArchiveInputStream(in);
         }
         if (CPIO.equalsIgnoreCase(archiverName)) {
-            if (entryEncoding != null) {
-                return new CpioArchiveInputStream(in, entryEncoding);
+            if (getEntryEncoding() != null) {
+                return new CpioArchiveInputStream(in, getEntryEncoding());
             } else {
                 return new CpioArchiveInputStream(in);
             }
         }
         if (DUMP.equalsIgnoreCase(archiverName)) {
-            if (entryEncoding != null) {
-                return new DumpArchiveInputStream(in, entryEncoding);
+            if (getEntryEncoding() != null) {
+                return new DumpArchiveInputStream(in, getEntryEncoding());
             } else {
                 return new DumpArchiveInputStream(in);
             }
@@ -239,14 +262,14 @@
         }
         if (ZIP.equalsIgnoreCase(archiverName)) {
             ZipArchiveOutputStream zip = new ZipArchiveOutputStream(out);
-            if (entryEncoding != null) {
-                zip.setEncoding(entryEncoding);
+            if (getEntryEncoding() != null) {
+                zip.setEncoding(getEntryEncoding());
             }
             return zip;
         }
         if (TAR.equalsIgnoreCase(archiverName)) {
-            if (entryEncoding != null) {
-                return new TarArchiveOutputStream(out, entryEncoding);
+            if (getEntryEncoding() != null) {
+                return new TarArchiveOutputStream(out, getEntryEncoding());
             } else {
                 return new TarArchiveOutputStream(out);
             }
@@ -255,8 +278,8 @@
             return new JarArchiveOutputStream(out);
         }
         if (CPIO.equalsIgnoreCase(archiverName)) {
-            if (entryEncoding != null) {
-                return new CpioArchiveOutputStream(out, entryEncoding);
+            if (getEntryEncoding() != null) {
+                return new CpioArchiveOutputStream(out, getEntryEncoding());
             } else {
                 return new CpioArchiveOutputStream(out);
             }
@@ -295,8 +318,8 @@
             int signatureLength = IOUtils.readFully(in, signature);
             in.reset();
             if (ZipArchiveInputStream.matches(signature, signatureLength)) {
-                if (entryEncoding != null) {
-                    return new ZipArchiveInputStream(in, entryEncoding);
+                if (getEntryEncoding() != null) {
+                    return new ZipArchiveInputStream(in, getEntryEncoding());
                 } else {
                     return new ZipArchiveInputStream(in);
                 }
@@ -327,8 +350,8 @@
             signatureLength = IOUtils.readFully(in, tarheader);
             in.reset();
             if (TarArchiveInputStream.matches(tarheader, signatureLength)) {
-                if (entryEncoding != null) {
-                    return new TarArchiveInputStream(in, entryEncoding);
+                if (getEntryEncoding() != null) {
+                    return new TarArchiveInputStream(in, getEntryEncoding());
                 } else {
                     return new TarArchiveInputStream(in);
                 }
