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 2013/01/05 20:28:42 UTC

svn commit: r1429363 - in /commons/proper/compress/trunk/src: changes/ main/java/org/apache/commons/compress/archivers/ar/ main/java/org/apache/commons/compress/archivers/cpio/ main/java/org/apache/commons/compress/archivers/tar/ main/java/org/apache/c...

Author: bodewig
Date: Sat Jan  5 19:28:42 2013
New Revision: 1429363

URL: http://svn.apache.org/viewvc?rev=1429363&view=rev
Log:
COMPRESS-172 reuse temporary byte-arrays in several places to reduce garbage collection pressure - inspired by a patch by Thomas Mair

Modified:
    commons/proper/compress/trunk/src/changes/changes.xml
    commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/ar/ArArchiveInputStream.java
    commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/cpio/CpioArchiveInputStream.java
    commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/tar/TarArchiveInputStream.java
    commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/zip/Zip64ExtendedInformationExtraField.java
    commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/zip/ZipArchiveEntry.java
    commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/zip/ZipArchiveInputStream.java
    commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/zip/ZipArchiveOutputStream.java
    commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/zip/ZipFile.java
    commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/compressors/gzip/GzipCompressorInputStream.java

Modified: commons/proper/compress/trunk/src/changes/changes.xml
URL: http://svn.apache.org/viewvc/commons/proper/compress/trunk/src/changes/changes.xml?rev=1429363&r1=1429362&r2=1429363&view=diff
==============================================================================
--- commons/proper/compress/trunk/src/changes/changes.xml (original)
+++ commons/proper/compress/trunk/src/changes/changes.xml Sat Jan  5 19:28:42 2013
@@ -107,6 +107,11 @@ The <action> type attribute can be add,u
         TarArchiveInputStream ignored the encoding for GNU long name
         entries.
       </action>
+      <action type="update" date="2013-01-05" issue="COMPRESS-172"
+              due-to="Thomas Mair">
+        Garbage collection pressure has been reduced by reusing
+        temporary byte arrays in classes.
+      </action>
     </release>
     <release version="1.4.1" date="2012-05-23"
              description="Release 1.4.1">

Modified: commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/ar/ArArchiveInputStream.java
URL: http://svn.apache.org/viewvc/commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/ar/ArArchiveInputStream.java?rev=1429363&r1=1429362&r2=1429363&view=diff
==============================================================================
--- commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/ar/ArArchiveInputStream.java (original)
+++ commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/ar/ArArchiveInputStream.java Sat Jan  5 19:28:42 2013
@@ -53,6 +53,13 @@ public class ArArchiveInputStream extend
      */
     private long entryOffset = -1;
 
+    // cached buffers
+    private final byte[] NAME_BUF = new byte[16];
+    private final byte[] LAST_MODIFIED_BUF = new byte[12];
+    private final byte[] ID_BUF = new byte[6];
+    private final byte[] FILE_MODE_BUF = new byte[8];
+    private final byte[] LENGTH_BUF = new byte[10];
+
     /**
      * Constructs an Ar input stream with the referenced stream
      * 
@@ -108,19 +115,13 @@ public class ArArchiveInputStream extend
             return null;
         }
 
-        final byte[] name = new byte[16];
-        final byte[] lastmodified = new byte[12];
-        final byte[] userid = new byte[6];
-        final byte[] groupid = new byte[6];
-        final byte[] filemode = new byte[8];
-        final byte[] length = new byte[10];
-
-        read(name);
-        read(lastmodified);
-        read(userid);
-        read(groupid);
-        read(filemode);
-        read(length);
+        read(NAME_BUF);
+        read(LAST_MODIFIED_BUF);
+        read(ID_BUF);
+        int userId = asInt(ID_BUF, true);
+        read(ID_BUF);
+        read(FILE_MODE_BUF);
+        read(LENGTH_BUF);
 
         {
             final byte[] expected = ArchiveUtils.toAsciiBytes(ArArchiveEntry.TRAILER);
@@ -141,13 +142,14 @@ public class ArArchiveInputStream extend
 //        GNU ar uses a '/' to mark the end of the filename; this allows for the use of spaces without the use of an extended filename.
 
         // entry name is stored as ASCII string
-        String temp = ArchiveUtils.toAsciiString(name).trim();
-        long len = asLong(length);
-
+        String temp = ArchiveUtils.toAsciiString(NAME_BUF).trim();
         if (isGNUStringTable(temp)) { // GNU extended filenames entry
-            currentEntry = readGNUStringTable(length);
+            currentEntry = readGNUStringTable(LENGTH_BUF);
             return getNextArEntry();
-        } else if (temp.endsWith("/")) { // GNU terminator
+        }
+
+        long len = asLong(LENGTH_BUF);
+        if (temp.endsWith("/")) { // GNU terminator
             temp = temp.substring(0, temp.length() - 1);
         } else if (isGNULongName(temp)) {
             int offset = Integer.parseInt(temp.substring(1));// get the offset
@@ -162,9 +164,10 @@ public class ArArchiveInputStream extend
             entryOffset += nameLen;
         }
 
-        currentEntry = new ArArchiveEntry(temp, len, asInt(userid, true),
-                                          asInt(groupid, true), asInt(filemode, 8),
-                                          asLong(lastmodified));
+        currentEntry = new ArArchiveEntry(temp, len, userId,
+                                          asInt(ID_BUF, true),
+                                          asInt(FILE_MODE_BUF, 8),
+                                          asLong(LAST_MODIFIED_BUF));
         return currentEntry;
     }
 

Modified: commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/cpio/CpioArchiveInputStream.java
URL: http://svn.apache.org/viewvc/commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/cpio/CpioArchiveInputStream.java?rev=1429363&r1=1429362&r2=1429363&view=diff
==============================================================================
--- commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/cpio/CpioArchiveInputStream.java (original)
+++ commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/cpio/CpioArchiveInputStream.java Sat Jan  5 19:28:42 2013
@@ -77,6 +77,11 @@ public class CpioArchiveInputStream exte
 
     private final InputStream in;
 
+    // cached buffers
+    private final byte[] TWO_BYTES_BUF = new byte[2];
+    private final byte[] FOUR_BYTES_BUF = new byte[4];
+    private final byte[] SIX_BYTES_BUF = new byte[6];
+
     /**
      * Construct the cpio input stream
      * 
@@ -165,20 +170,18 @@ public class CpioArchiveInputStream exte
         if (this.entry != null) {
             closeEntry();
         }
-        byte magic[] = new byte[2];
-        readFully(magic, 0, magic.length);
-        if (CpioUtil.byteArray2long(magic, false) == MAGIC_OLD_BINARY) {
+        readFully(TWO_BYTES_BUF, 0, TWO_BYTES_BUF.length);
+        if (CpioUtil.byteArray2long(TWO_BYTES_BUF, false) == MAGIC_OLD_BINARY) {
             this.entry = readOldBinaryEntry(false);
-        } else if (CpioUtil.byteArray2long(magic, true) == MAGIC_OLD_BINARY) {
+        } else if (CpioUtil.byteArray2long(TWO_BYTES_BUF, true)
+                   == MAGIC_OLD_BINARY) {
             this.entry = readOldBinaryEntry(true);
         } else {
-            byte more_magic[] = new byte[4];
-            readFully(more_magic, 0, more_magic.length);
-            byte tmp[] = new byte[6];
-            System.arraycopy(magic, 0, tmp, 0, magic.length);
-            System.arraycopy(more_magic, 0, tmp, magic.length,
-                    more_magic.length);
-            String magicString = ArchiveUtils.toAsciiString(tmp);
+            System.arraycopy(TWO_BYTES_BUF, 0, SIX_BYTES_BUF, 0,
+                             TWO_BYTES_BUF.length);
+            readFully(SIX_BYTES_BUF, TWO_BYTES_BUF.length,
+                      FOUR_BYTES_BUF.length);
+            String magicString = ArchiveUtils.toAsciiString(SIX_BYTES_BUF);
             if (magicString.equals(MAGIC_NEW)) {
                 this.entry = readNewEntry(false);
             } else if (magicString.equals(MAGIC_NEW_CRC)) {
@@ -202,9 +205,9 @@ public class CpioArchiveInputStream exte
     }
 
     private void skip(int bytes) throws IOException{
-        final byte[] buff = new byte[4]; // Cannot be more than 3 bytes
+        // bytes cannot be more than 3 bytes
         if (bytes > 0) {
-            readFully(buff, 0, bytes);
+            readFully(FOUR_BYTES_BUF, 0, bytes);
         }
     }
 

Modified: commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/tar/TarArchiveInputStream.java
URL: http://svn.apache.org/viewvc/commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/tar/TarArchiveInputStream.java?rev=1429363&r1=1429362&r2=1429363&view=diff
==============================================================================
--- commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/tar/TarArchiveInputStream.java (original)
+++ commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/tar/TarArchiveInputStream.java Sat Jan  5 19:28:42 2013
@@ -48,6 +48,9 @@ public class TarArchiveInputStream exten
     private static final int SMALL_BUFFER_SIZE = 256;
     private static final int BUFFER_SIZE = 8 * 1024;
 
+    private final byte[] SKIP_BUF = new byte[BUFFER_SIZE];
+    private final byte[] SMALL_BUF = new byte[SMALL_BUFFER_SIZE];
+
     private boolean hasHitEOF;
     private long entrySize;
     private long entryOffset;
@@ -175,11 +178,11 @@ public class TarArchiveInputStream exten
         // This is horribly inefficient, but it ensures that we
         // properly skip over bytes via the TarBuffer...
         //
-        byte[] skipBuf = new byte[BUFFER_SIZE];
         long skip = numToSkip;
         while (skip > 0) {
-            int realSkip = (int) (skip > skipBuf.length ? skipBuf.length : skip);
-            int numRead = read(skipBuf, 0, realSkip);
+            int realSkip = (int) (skip > SKIP_BUF.length
+                                  ? SKIP_BUF.length : skip);
+            int numRead = read(SKIP_BUF, 0, realSkip);
             if (numRead == -1) {
                 break;
             }
@@ -248,10 +251,9 @@ public class TarArchiveInputStream exten
         if (currEntry.isGNULongNameEntry()) {
             // read in the name
             ByteArrayOutputStream longName = new ByteArrayOutputStream();
-            byte[] buf = new byte[SMALL_BUFFER_SIZE];
             int length = 0;
-            while ((length = read(buf)) >= 0) {
-                longName.write(buf, 0, length);
+            while ((length = read(SMALL_BUF)) >= 0) {
+                longName.write(SMALL_BUF, 0, length);
             }
             getNextEntry();
             if (currEntry == null) {

Modified: commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/zip/Zip64ExtendedInformationExtraField.java
URL: http://svn.apache.org/viewvc/commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/zip/Zip64ExtendedInformationExtraField.java?rev=1429363&r1=1429362&r2=1429363&view=diff
==============================================================================
--- commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/zip/Zip64ExtendedInformationExtraField.java (original)
+++ commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/zip/Zip64ExtendedInformationExtraField.java Sat Jan  5 19:28:42 2013
@@ -80,6 +80,7 @@ public class Zip64ExtendedInformationExt
     private static final String LFH_MUST_HAVE_BOTH_SIZES_MSG =
         "Zip64 extended information must contain"
         + " both size values in the local file header.";
+    private static final byte[] EMPTY = new byte[0];
 
     private ZipEightByteInteger size, compressedSize, relativeHeaderOffset;
     private ZipLong diskStart;
@@ -161,7 +162,7 @@ public class Zip64ExtendedInformationExt
             addSizes(data);
             return data;
         }
-        return new byte[0];
+        return EMPTY;
     }
 
     /** {@inheritDoc} */
@@ -353,4 +354,4 @@ public class Zip64ExtendedInformationExt
         }
         return off;
     }
-}
\ No newline at end of file
+}

Modified: commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/zip/ZipArchiveEntry.java
URL: http://svn.apache.org/viewvc/commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/zip/ZipArchiveEntry.java?rev=1429363&r1=1429362&r2=1429363&view=diff
==============================================================================
--- commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/zip/ZipArchiveEntry.java (original)
+++ commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/zip/ZipArchiveEntry.java Sat Jan  5 19:28:42 2013
@@ -55,6 +55,7 @@ public class ZipArchiveEntry extends jav
     public static final int PLATFORM_FAT  = 0;
     private static final int SHORT_MASK = 0xFFFF;
     private static final int SHORT_SHIFT = 16;
+    private static final byte[] EMPTY = new byte[0];
 
     /**
      * The {@link java.util.zip.ZipEntry} base class only supports
@@ -475,7 +476,7 @@ public class ZipArchiveEntry extends jav
      */
     public byte[] getLocalFileDataExtra() {
         byte[] extra = getExtra();
-        return extra != null ? extra : new byte[0];
+        return extra != null ? extra : EMPTY;
     }
 
     /**

Modified: commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/zip/ZipArchiveInputStream.java
URL: http://svn.apache.org/viewvc/commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/zip/ZipArchiveInputStream.java?rev=1429363&r1=1429362&r2=1429363&view=diff
==============================================================================
--- commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/zip/ZipArchiveInputStream.java (original)
+++ commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/zip/ZipArchiveInputStream.java Sat Jan  5 19:28:42 2013
@@ -128,6 +128,12 @@ public class ZipArchiveInputStream exten
 
     private static final long TWO_EXP_32 = ZIP64_MAGIC + 1;
 
+    // cached buffers
+    private final byte[] LFH_BUF = new byte[LFH_LEN];
+    private final byte[] SKIP_BUF = new byte[1024];
+    private final byte[] WORD_BUF = new byte[WORD];
+    private final byte[] TWO_DWORD_BUF = new byte[2 * DWORD];
+
     public ZipArchiveInputStream(InputStream inputStream) {
         this(inputStream, ZipEncodingHelper.UTF8);
     }
@@ -183,22 +189,21 @@ public class ZipArchiveInputStream exten
             firstEntry = false;
         }
 
-        byte[] lfh = new byte[LFH_LEN];
         try {
             if (firstEntry) {
                 // split archives have a special signature before the
                 // first local file header - look for it and fail with
                 // the appropriate error message if this is a split
                 // archive.
-                readFirstLocalFileHeader(lfh);
+                readFirstLocalFileHeader(LFH_BUF);
             } else {
-                readFully(lfh);
+                readFully(LFH_BUF);
             }
         } catch (EOFException e) {
             return null;
         }
             
-        ZipLong sig = new ZipLong(lfh);
+        ZipLong sig = new ZipLong(LFH_BUF);
         if (sig.equals(ZipLong.CFH_SIG)) {
             hitCentralDirectory = true;
             return null;
@@ -210,12 +215,12 @@ public class ZipArchiveInputStream exten
         int off = WORD;
         current = new CurrentEntry();
 
-        int versionMadeBy = ZipShort.getValue(lfh, off);
+        int versionMadeBy = ZipShort.getValue(LFH_BUF, off);
         off += SHORT;
         current.entry.setPlatform((versionMadeBy >> ZipFile.BYTE_SHIFT)
                                   & ZipFile.NIBLET_MASK);
 
-        final GeneralPurposeBit gpFlag = GeneralPurposeBit.parse(lfh, off);
+        final GeneralPurposeBit gpFlag = GeneralPurposeBit.parse(LFH_BUF, off);
         final boolean hasUTF8Flag = gpFlag.usesUTF8ForNames();
         final ZipEncoding entryEncoding =
             hasUTF8Flag ? ZipEncodingHelper.UTF8_ZIP_ENCODING : zipEncoding;
@@ -224,32 +229,32 @@ public class ZipArchiveInputStream exten
 
         off += SHORT;
 
-        current.entry.setMethod(ZipShort.getValue(lfh, off));
+        current.entry.setMethod(ZipShort.getValue(LFH_BUF, off));
         off += SHORT;
 
-        long time = ZipUtil.dosToJavaTime(ZipLong.getValue(lfh, off));
+        long time = ZipUtil.dosToJavaTime(ZipLong.getValue(LFH_BUF, off));
         current.entry.setTime(time);
         off += WORD;
 
         ZipLong size = null, cSize = null;
         if (!current.hasDataDescriptor) {
-            current.entry.setCrc(ZipLong.getValue(lfh, off));
+            current.entry.setCrc(ZipLong.getValue(LFH_BUF, off));
             off += WORD;
 
-            cSize = new ZipLong(lfh, off);
+            cSize = new ZipLong(LFH_BUF, off);
             off += WORD;
 
-            size = new ZipLong(lfh, off);
+            size = new ZipLong(LFH_BUF, off);
             off += WORD;
         } else {
             off += 3 * WORD;
         }
 
-        int fileNameLen = ZipShort.getValue(lfh, off);
+        int fileNameLen = ZipShort.getValue(LFH_BUF, off);
 
         off += SHORT;
 
-        int extraLen = ZipShort.getValue(lfh, off);
+        int extraLen = ZipShort.getValue(LFH_BUF, off);
         off += SHORT;
 
         byte[] fileName = new byte[fileNameLen];
@@ -484,10 +489,11 @@ public class ZipArchiveInputStream exten
     public long skip(long value) throws IOException {
         if (value >= 0) {
             long skipped = 0;
-            byte[] b = new byte[1024];
             while (skipped < value) {
                 long rem = value - skipped;
-                int x = read(b, 0, (int) (b.length > rem ? rem : b.length));
+                int x = read(SKIP_BUF, 0,
+                             (int) (SKIP_BUF.length > rem ? rem
+                                    : SKIP_BUF.length));
                 if (x == -1) {
                     return skipped;
                 }
@@ -655,13 +661,12 @@ public class ZipArchiveInputStream exten
     }
 
     private void readDataDescriptor() throws IOException {
-        byte[] b = new byte[WORD];
-        readFully(b);
-        ZipLong val = new ZipLong(b);
+        readFully(WORD_BUF);
+        ZipLong val = new ZipLong(WORD_BUF);
         if (ZipLong.DD_SIG.equals(val)) {
             // data descriptor with signature, skip sig
-            readFully(b);
-            val = new ZipLong(b);
+            readFully(WORD_BUF);
+            val = new ZipLong(WORD_BUF);
         }
         current.entry.setCrc(val.getValue());
 
@@ -676,18 +681,19 @@ public class ZipArchiveInputStream exten
         // descriptor (ignoring archive decryption headers for now).
         // If so, push back eight bytes and assume sizes are four
         // bytes, otherwise sizes are eight bytes each.
-        b = new byte[2 * DWORD];
-        readFully(b);
-        ZipLong potentialSig = new ZipLong(b, DWORD);
+        readFully(TWO_DWORD_BUF);
+        ZipLong potentialSig = new ZipLong(TWO_DWORD_BUF, DWORD);
         if (potentialSig.equals(ZipLong.CFH_SIG)
             || potentialSig.equals(ZipLong.LFH_SIG)) {
-            pushback(b, DWORD, DWORD);
-            current.entry.setCompressedSize(ZipLong.getValue(b));
-            current.entry.setSize(ZipLong.getValue(b, WORD));
+            pushback(TWO_DWORD_BUF, DWORD, DWORD);
+            current.entry.setCompressedSize(ZipLong.getValue(TWO_DWORD_BUF));
+            current.entry.setSize(ZipLong.getValue(TWO_DWORD_BUF, WORD));
         } else {
             current.entry
-                .setCompressedSize(ZipEightByteInteger.getLongValue(b));
-            current.entry.setSize(ZipEightByteInteger.getLongValue(b, DWORD));
+                .setCompressedSize(ZipEightByteInteger
+                                   .getLongValue(TWO_DWORD_BUF));
+            current.entry.setSize(ZipEightByteInteger
+                                  .getLongValue(TWO_DWORD_BUF, DWORD));
         }
     }
 

Modified: commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/zip/ZipArchiveOutputStream.java
URL: http://svn.apache.org/viewvc/commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/zip/ZipArchiveOutputStream.java?rev=1429363&r1=1429362&r2=1429363&view=diff
==============================================================================
--- commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/zip/ZipArchiveOutputStream.java (original)
+++ commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/zip/ZipArchiveOutputStream.java Sat Jan  5 19:28:42 2013
@@ -115,6 +115,8 @@ public class ZipArchiveOutputStream exte
     @Deprecated
     public static final int EFS_FLAG = GeneralPurposeBit.UFT8_NAMES_FLAG;
 
+    private static final byte[] EMPTY = new byte[0];
+
     /**
      * Current entry.
      */
@@ -444,7 +446,7 @@ public class ZipArchiveOutputStream exte
         }
 
         if (!entry.hasWritten) {
-            write(new byte[0], 0, 0);
+            write(EMPTY, 0, 0);
         }
 
         flushDeflater();

Modified: commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/zip/ZipFile.java
URL: http://svn.apache.org/viewvc/commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/zip/ZipFile.java?rev=1429363&r1=1429362&r2=1429363&view=diff
==============================================================================
--- commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/zip/ZipFile.java (original)
+++ commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/zip/ZipFile.java Sat Jan  5 19:28:42 2013
@@ -132,6 +132,12 @@ public class ZipFile {
      */
     private boolean closed;
 
+    // cached buffers
+    private final byte[] DWORD_BUF = new byte[DWORD];
+    private final byte[] WORD_BUF = new byte[WORD];
+    private final byte[] CFH_BUF = new byte[CFH_LEN];
+    private final byte[] SHORT_BUF = new byte[SHORT];
+
     /**
      * Opens the given file for reading, assuming "UTF8" for file names.
      *
@@ -405,9 +411,8 @@ public class ZipFile {
 
         positionAtCentralDirectory();
 
-        byte[] signatureBytes = new byte[WORD];
-        archive.readFully(signatureBytes);
-        long sig = ZipLong.getValue(signatureBytes);
+        archive.readFully(WORD_BUF);
+        long sig = ZipLong.getValue(WORD_BUF);
 
         if (sig != CFH_SIG && startsWithLocalFileHeader()) {
             throw new IOException("central directory is empty, can't expand"
@@ -416,8 +421,8 @@ public class ZipFile {
 
         while (sig == CFH_SIG) {
             readCentralDirectoryEntry(noUTF8Flag);
-            archive.readFully(signatureBytes);
-            sig = ZipLong.getValue(signatureBytes);
+            archive.readFully(WORD_BUF);
+            sig = ZipLong.getValue(WORD_BUF);
         }
         return noUTF8Flag;
     }
@@ -434,19 +439,17 @@ public class ZipFile {
     private void
         readCentralDirectoryEntry(Map<ZipArchiveEntry, NameAndComment> noUTF8Flag)
         throws IOException {
-        byte[] cfh = new byte[CFH_LEN];
-
-        archive.readFully(cfh);
+        archive.readFully(CFH_BUF);
         int off = 0;
         ZipArchiveEntry ze = new ZipArchiveEntry();
 
-        int versionMadeBy = ZipShort.getValue(cfh, off);
+        int versionMadeBy = ZipShort.getValue(CFH_BUF, off);
         off += SHORT;
         ze.setPlatform((versionMadeBy >> BYTE_SHIFT) & NIBLET_MASK);
 
         off += SHORT; // skip version info
 
-        final GeneralPurposeBit gpFlag = GeneralPurposeBit.parse(cfh, off);
+        final GeneralPurposeBit gpFlag = GeneralPurposeBit.parse(CFH_BUF, off);
         final boolean hasUTF8Flag = gpFlag.usesUTF8ForNames();
         final ZipEncoding entryEncoding =
             hasUTF8Flag ? ZipEncodingHelper.UTF8_ZIP_ENCODING : zipEncoding;
@@ -454,38 +457,38 @@ public class ZipFile {
 
         off += SHORT;
 
-        ze.setMethod(ZipShort.getValue(cfh, off));
+        ze.setMethod(ZipShort.getValue(CFH_BUF, off));
         off += SHORT;
 
-        long time = ZipUtil.dosToJavaTime(ZipLong.getValue(cfh, off));
+        long time = ZipUtil.dosToJavaTime(ZipLong.getValue(CFH_BUF, off));
         ze.setTime(time);
         off += WORD;
 
-        ze.setCrc(ZipLong.getValue(cfh, off));
+        ze.setCrc(ZipLong.getValue(CFH_BUF, off));
         off += WORD;
 
-        ze.setCompressedSize(ZipLong.getValue(cfh, off));
+        ze.setCompressedSize(ZipLong.getValue(CFH_BUF, off));
         off += WORD;
 
-        ze.setSize(ZipLong.getValue(cfh, off));
+        ze.setSize(ZipLong.getValue(CFH_BUF, off));
         off += WORD;
 
-        int fileNameLen = ZipShort.getValue(cfh, off);
+        int fileNameLen = ZipShort.getValue(CFH_BUF, off);
         off += SHORT;
 
-        int extraLen = ZipShort.getValue(cfh, off);
+        int extraLen = ZipShort.getValue(CFH_BUF, off);
         off += SHORT;
 
-        int commentLen = ZipShort.getValue(cfh, off);
+        int commentLen = ZipShort.getValue(CFH_BUF, off);
         off += SHORT;
 
-        int diskStart = ZipShort.getValue(cfh, off);
+        int diskStart = ZipShort.getValue(CFH_BUF, off);
         off += SHORT;
 
-        ze.setInternalAttributes(ZipShort.getValue(cfh, off));
+        ze.setInternalAttributes(ZipShort.getValue(CFH_BUF, off));
         off += SHORT;
 
-        ze.setExternalAttributes(ZipLong.getValue(cfh, off));
+        ze.setExternalAttributes(ZipLong.getValue(CFH_BUF, off));
         off += WORD;
 
         byte[] fileName = new byte[fileNameLen];
@@ -494,7 +497,7 @@ public class ZipFile {
 
         // LFH offset,
         OffsetEntry offset = new OffsetEntry();
-        offset.headerOffset = ZipLong.getValue(cfh, off);
+        offset.headerOffset = ZipLong.getValue(CFH_BUF, off);
         // data offset will be filled later
         entries.put(ze, offset);
 
@@ -684,24 +687,17 @@ public class ZipFile {
     private void positionAtCentralDirectory64()
         throws IOException {
         skipBytes(ZIP64_EOCDL_LOCATOR_OFFSET);
-        byte[] zip64EocdOffset = new byte[DWORD];
-        archive.readFully(zip64EocdOffset);
-        archive.seek(ZipEightByteInteger.getLongValue(zip64EocdOffset));
-        byte[] sig = new byte[WORD];
-        archive.readFully(sig);
-        if (sig[POS_0] != ZipArchiveOutputStream.ZIP64_EOCD_SIG[POS_0]
-            || sig[POS_1] != ZipArchiveOutputStream.ZIP64_EOCD_SIG[POS_1]
-            || sig[POS_2] != ZipArchiveOutputStream.ZIP64_EOCD_SIG[POS_2]
-            || sig[POS_3] != ZipArchiveOutputStream.ZIP64_EOCD_SIG[POS_3]
-            ) {
+        archive.readFully(DWORD_BUF);
+        archive.seek(ZipEightByteInteger.getLongValue(DWORD_BUF));
+        archive.readFully(WORD_BUF);
+        if (!Arrays.equals(WORD_BUF, ZipArchiveOutputStream.ZIP64_EOCD_SIG)) {
             throw new ZipException("archive's ZIP64 end of central "
                                    + "directory locator is corrupt.");
         }
         skipBytes(ZIP64_EOCD_CFD_LOCATOR_OFFSET
                   - WORD /* signature has already been read */);
-        byte[] cfdOffset = new byte[DWORD];
-        archive.readFully(cfdOffset);
-        archive.seek(ZipEightByteInteger.getLongValue(cfdOffset));
+        archive.readFully(DWORD_BUF);
+        archive.seek(ZipEightByteInteger.getLongValue(DWORD_BUF));
     }
 
     /**
@@ -717,9 +713,8 @@ public class ZipFile {
             throw new ZipException("archive is not a ZIP archive");
         }
         skipBytes(CFD_LOCATOR_OFFSET);
-        byte[] cfdOffset = new byte[WORD];
-        archive.readFully(cfdOffset);
-        archive.seek(ZipLong.getValue(cfdOffset));
+        archive.readFully(WORD_BUF);
+        archive.seek(ZipLong.getValue(WORD_BUF));
     }
 
     /**
@@ -814,11 +809,10 @@ public class ZipFile {
             OffsetEntry offsetEntry = ent.getValue();
             long offset = offsetEntry.headerOffset;
             archive.seek(offset + LFH_OFFSET_FOR_FILENAME_LENGTH);
-            byte[] b = new byte[SHORT];
-            archive.readFully(b);
-            int fileNameLen = ZipShort.getValue(b);
-            archive.readFully(b);
-            int extraFieldLen = ZipShort.getValue(b);
+            archive.readFully(SHORT_BUF);
+            int fileNameLen = ZipShort.getValue(SHORT_BUF);
+            archive.readFully(SHORT_BUF);
+            int extraFieldLen = ZipShort.getValue(SHORT_BUF);
             int lenToSkip = fileNameLen;
             while (lenToSkip > 0) {
                 int skipped = archive.skipBytes(lenToSkip);
@@ -854,14 +848,8 @@ public class ZipFile {
      */
     private boolean startsWithLocalFileHeader() throws IOException {
         archive.seek(0);
-        final byte[] start = new byte[WORD];
-        archive.readFully(start);
-        for (int i = 0; i < start.length; i++) {
-            if (start[i] != ZipArchiveOutputStream.LFH_SIG[i]) {
-                return false;
-            }
-        }
-        return true;
+        archive.readFully(WORD_BUF);
+        return Arrays.equals(WORD_BUF, ZipArchiveOutputStream.LFH_SIG);
     }
 
     /**

Modified: commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/compressors/gzip/GzipCompressorInputStream.java
URL: http://svn.apache.org/viewvc/commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/compressors/gzip/GzipCompressorInputStream.java?rev=1429363&r1=1429362&r2=1429363&view=diff
==============================================================================
--- commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/compressors/gzip/GzipCompressorInputStream.java (original)
+++ commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/compressors/gzip/GzipCompressorInputStream.java Sat Jan  5 19:28:42 2013
@@ -76,6 +76,9 @@ public class GzipCompressorInputStream e
     // True once everything has been decompressed
     private boolean endReached = false;
 
+    // used in no-arg read method
+    private final byte[] oneByte = new byte[1];
+
     /**
      * Constructs a new input stream that decompresses gzip-compressed data
      * from the specified input stream.
@@ -213,8 +216,7 @@ public class GzipCompressorInputStream e
     /** {@inheritDoc} */
     @Override
     public int read() throws IOException {
-        byte[] buf = new byte[1];
-        return read(buf, 0, 1) == -1 ? -1 : (buf[0] & 0xFF);
+        return read(oneByte, 0, 1) == -1 ? -1 : (oneByte[0] & 0xFF);
     }
 
     /**