< prev index next >

src/java.base/share/classes/sun/misc/JarIndex.java

Print this page

        

@@ -23,14 +23,30 @@
  * questions.
  */
 
 package sun.misc;
 
-import java.io.*;
-import java.util.*;
-import java.util.jar.*;
-import java.util.zip.*;
+import java.io.BufferedReader;
+import java.io.BufferedWriter;
+import java.io.ByteArrayInputStream;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.OutputStream;
+import java.io.OutputStreamWriter;
+import java.nio.ByteBuffer;
+import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.Map;
+import java.util.Vector;
+import java.util.jar.JarEntry;
+import java.util.jar.JarFile;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipFile;
 
 /**
  * This class is used to maintain mappings from packages, classes
  * and resources to their enclosing JAR files. Mappings are kept
  * at the package level except for class or resource files that

@@ -72,10 +88,13 @@
      * be added to the index. Otherwise, just the directory names are added.
      */
     private static final boolean metaInfFilenames =
         "true".equals(System.getProperty("sun.misc.JarIndex.metaInfFilenames"));
 
+    private static final sun.misc.JavaUtilZipFileAccess zipAccess
+            = sun.misc.SharedSecrets.getJavaUtilZipFileAccess();
+
     /**
      * Constructs a new, empty jar index.
      */
     public JarIndex() {
         indexMap = new HashMap<>();

@@ -132,12 +151,21 @@
             return null;
         }
         JarEntry e = jar.getJarEntry(INDEX_NAME);
         // if found, then load the index
         if (e != null) {
+            long size = e.getSize();
+            if (size > 0 && size < 512 * 1024) {
+                byte[] bytes = new byte[(int) size];
+                ByteBuffer bb = ByteBuffer.wrap(bytes);
+                zipAccess.fillByteBuffer(jar, e, bb);
+                index = new JarIndex(new ByteArrayInputStream(bytes, 0, bb.position()));
+            } else {
+                // Unknown or too large ZipEntry size to use a array
             index = new JarIndex(jar.getInputStream(e));
         }
+        }
         return index;
     }
 
     /**
      * Returns the jar files that are defined in this index.
< prev index next >