Class MemoryJarFile

  • All Implemented Interfaces:
    IJarFile, java.io.Closeable, java.lang.AutoCloseable

    public class MemoryJarFile
    extends java.util.jar.JarFile
    implements IJarFile
    Extends the normal Jar file for processing files with various character case, and mixture of forward and backslashes. It is used to load entirely into memory and supports decryption on entry basis.

    Please note that this class currently only supports file items smaller than 2 GB, i.e. a 31 bit long positive integer value.

    Author:
    Christopher Mindus
    • Method Summary

      All Methods Static Methods Instance Methods Concrete Methods 
      Modifier and Type Method Description
      void close()
      Closes the ZIP file.
      static MemoryJarFile createJarFile​(java.io.File file, boolean verify, boolean winStyle, MemoryJarFileDecrypter streamDecrypter, MemoryJarFileDecrypter entryDecrypter)
      Creates a memory Jar file.
      static MemoryJarFile createJarFile​(java.io.InputStream in, boolean verify, boolean winStyle, MemoryJarFileDecrypter streamDecrypter, MemoryJarFileDecrypter entryDecrypter, long lastModified)
      Creates a memory Jar file.
      static MemoryJarFile createJarFile​(java.lang.String fileName, boolean verify, boolean winStyle, MemoryJarFileDecrypter streamDecrypter, MemoryJarFileDecrypter entryDecrypter)
      Creates a memory Jar file.
      static MemoryJarFile createJarFile​(java.util.jar.JarInputStream jin, boolean winStyle, long lastModified)
      Creates a memory Jar file.
      static MemoryJarFile createJarFile​(java.util.jar.JarInputStream jin, boolean winStyle, MemoryJarFileDecrypter decrypter, long lastModified)
      Creates a memory Jar file.
      static MemoryJarFile createJarFile​(java.util.jar.JarInputStream jin, long lastModified)
      Creates a memory Jar file.
      java.util.Enumeration<java.util.jar.JarEntry> entries()
      Returns an enumeration of the Jar file entries.
      byte[] getByteArray​(java.util.zip.ZipEntry ze)
      Returns the byte array of the contents of the specified zip file entry.
      java.util.zip.ZipEntry getEntry​(java.lang.String name)
      Gets the Zip entry with the specified name.
      byte[] getEntryData​(java.lang.String name)
      Gets the byte [] data for an entry if present.
      byte[] getEntryData​(java.util.zip.ZipEntry ze)
      Gets the byte [] data for an entry if present.
      Handler getHandler()
      Gets the URL stream handler for the MemoryJarFile.
      java.io.InputStream getInputStream​(java.util.zip.ZipEntry ze)
      Returns an input stream for reading the contents of the specified zip file entry.
      java.util.jar.JarEntry[] getJarEntries()
      Gets all Jar entries if the Jar file is loaded into memory.
      java.util.jar.JarEntry getJarEntry​(java.lang.String name)
      Gets the Jar entry with the specified name.
      java.io.File getJarFile()
      Gets the file of the Jar file.
      java.util.jar.Manifest getManifest()
      Returns the Jar file manifest, or null if none.
      java.lang.String getName()
      Gets the name of the Jar file.
      java.net.URL getURL()
      Gets the MemoryJar URL to be used with e.g.
      java.net.URL getURL​(java.lang.String path)
      Gets the MemoryJar URL to be used with e.g.
      java.net.URL getURL​(java.util.zip.ZipEntry entry)
      Gets the MemoryJar URL to be used with e.g.
      long lastModified()
      Returns the time that the file denoted by this abstract pathname was last modified.
      void setName​(java.lang.String name)
      Sets the name of the Jar file.
      int size()
      Returns the number of entries in the Jar file.
      java.util.stream.Stream<java.util.jar.JarEntry> stream()
      Returns a stream of Jar entries.
      • Methods inherited from class java.util.jar.JarFile

        baseVersion, getVersion, isMultiRelease, runtimeVersion, versionedStream
      • Methods inherited from class java.util.zip.ZipFile

        finalize, getComment
      • Methods inherited from class java.lang.Object

        clone, equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
    • Method Detail

      • createJarFile

        public static MemoryJarFile createJarFile​(java.util.jar.JarInputStream jin,
                                                  long lastModified)
                                           throws java.io.IOException
        Creates a memory Jar file. The Jar input stream is closed before returning, the new Jar file will not have the 'winStyle' parameter set.
        Parameters:
        jin - the Jar input stream.
        lastModified - time for last file modification, -1L for when the first empty Jar was created.
        Throws:
        java.io.IOException - for file failures.
      • createJarFile

        public static MemoryJarFile createJarFile​(java.util.jar.JarInputStream jin,
                                                  boolean winStyle,
                                                  long lastModified)
                                           throws java.io.IOException
        Creates a memory Jar file. The Jar input stream is closed before returning.
        Parameters:
        jin - the Jar input stream.
        winStyle - if true, the entries are case insensitive and backslash can be used with forward slash as well.
        lastModified - time for last file modification, -1L for when the first empty Jar was created.
        Throws:
        java.io.IOException - for file failures.
      • createJarFile

        public static MemoryJarFile createJarFile​(java.util.jar.JarInputStream jin,
                                                  boolean winStyle,
                                                  MemoryJarFileDecrypter decrypter,
                                                  long lastModified)
                                           throws java.io.IOException
        Creates a memory Jar file. The Jar input stream is closed before returning.
        Parameters:
        jin - the Jar input stream.
        winStyle - if true, the entries are case insensitive and backslash can be used with forward slash as well.
        decrypter - an instance of a class implementing the MemoryJarFileDecrypter interface to provide decryption of an entry.
        lastModified - time for last file modification, -1L for when the first empty Jar was created.
        Throws:
        java.io.IOException - for file failures.
      • createJarFile

        public static MemoryJarFile createJarFile​(java.io.InputStream in,
                                                  boolean verify,
                                                  boolean winStyle,
                                                  MemoryJarFileDecrypter streamDecrypter,
                                                  MemoryJarFileDecrypter entryDecrypter,
                                                  long lastModified)
                                           throws java.io.IOException
        Creates a memory Jar file. The input stream is closed before returning.
        Parameters:
        in - an input stream.
        verify - set to true to verify the Jar file for correctness.
        winStyle - if true, the entries are case insensitive and backslash can be used with forward slash as well.
        streamDecrypter - an instance of a class implementing the MemoryJarFileDecrypter interface to provide decryption of the entire input stream data, set to null for no decryption.
        entryDecrypter - an instance of a class implementing the MemoryJarFileDecrypter interface to provide decryption of an entry, set to null for no decryption.
        lastModified - time for last file modification, -1L for when the first empty Jar was created.
        Throws:
        java.io.IOException - for file failures.
      • createJarFile

        public static MemoryJarFile createJarFile​(java.lang.String fileName,
                                                  boolean verify,
                                                  boolean winStyle,
                                                  MemoryJarFileDecrypter streamDecrypter,
                                                  MemoryJarFileDecrypter entryDecrypter)
                                           throws java.io.IOException
        Creates a memory Jar file. The file is closed before returning.
        Parameters:
        fileName - the file name of Jar file to read.
        verify - set to true to verify the Jar file for correctness.
        winStyle - if true, the entries are case insensitive and backslash can be used with forward slash as well.
        streamDecrypter - an instance of a class implementing the MemoryJarFileDecrypter interface to provide decryption of the entire input stream data, set to null for no decryption.
        entryDecrypter - an instance of a class implementing the MemoryJarFileDecrypter interface to provide decryption of an entry, set to null for no decryption.
        Throws:
        java.io.IOException - for file failures.
      • createJarFile

        public static MemoryJarFile createJarFile​(java.io.File file,
                                                  boolean verify,
                                                  boolean winStyle,
                                                  MemoryJarFileDecrypter streamDecrypter,
                                                  MemoryJarFileDecrypter entryDecrypter)
                                           throws java.io.IOException
        Creates a memory Jar file. The File is closed before returning.
        Parameters:
        file - the Jar File instance to read.
        verify - set to true to verify the Jar file for correctness.
        winStyle - if true, the entries are case insensitive and backslash can be used with forward slash as well.
        streamDecrypter - an instance of a class implementing the MemoryJarFileDecrypter interface to provide decryption of the entire input stream data, set to null for no decryption.
        entryDecrypter - an instance of a class implementing the MemoryJarFileDecrypter interface to provide decryption of an entry, set to null for no decryption.
        Throws:
        java.io.IOException - for file failures.
      • getJarFile

        public java.io.File getJarFile()
        Gets the file of the Jar file.
        Specified by:
        getJarFile in interface IJarFile
        Returns:
        Always returns null as there is no File representation for a memory Jar.
      • lastModified

        public long lastModified()
        Returns the time that the file denoted by this abstract pathname was last modified.
        Specified by:
        lastModified in interface IJarFile
        Returns:
        A long value representing the time the file was last modified, measured in milliseconds since the epoch (00:00:00 GMT, January 1, 1970), or 0L if the file does not exist or if an I/O error occurs
      • getHandler

        public Handler getHandler()
        Gets the URL stream handler for the MemoryJarFile.
        Specified by:
        getHandler in interface IJarFile
        Returns:
        The stream handler.
      • getURL

        public java.net.URL getURL()
        Gets the MemoryJar URL to be used with e.g. a class loader.
        Specified by:
        getURL in interface IJarFile
        Returns:
        An URL with the stream handler initialized to this Jar file.
      • getURL

        public java.net.URL getURL​(java.util.zip.ZipEntry entry)
        Gets the MemoryJar URL to be used with e.g. a class loader.
        Specified by:
        getURL in interface IJarFile
        Parameters:
        entry - The Jar entry.
        Returns:
        An URL with the stream handler initialized to this Jar file.
      • getURL

        public java.net.URL getURL​(java.lang.String path)
        Gets the MemoryJar URL to be used with e.g. a class loader.
        Specified by:
        getURL in interface IJarFile
        Parameters:
        path - A path specification.
        Returns:
        An URL with the stream handler initialized to this Jar file.
      • entries

        public java.util.Enumeration<java.util.jar.JarEntry> entries()
        Returns an enumeration of the Jar file entries.
        Specified by:
        entries in interface IJarFile
        Overrides:
        entries in class java.util.jar.JarFile
        Returns:
        an enumeration of the Jar file entries.
      • stream

        public java.util.stream.Stream<java.util.jar.JarEntry> stream()
        Returns a stream of Jar entries.
        Specified by:
        stream in interface IJarFile
        Overrides:
        stream in class java.util.jar.JarFile
        Returns:
        an ordered, distinct, immutable and non-null stream of the Jar file entries.
      • getJarEntries

        public java.util.jar.JarEntry[] getJarEntries()
        Gets all Jar entries if the Jar file is loaded into memory.
        Specified by:
        getJarEntries in interface IJarFile
        Returns:
        All the entries as a new array.
      • getInputStream

        public java.io.InputStream getInputStream​(java.util.zip.ZipEntry ze)
                                           throws java.io.FileNotFoundException
        Returns an input stream for reading the contents of the specified zip file entry.
        Specified by:
        getInputStream in interface IJarFile
        Overrides:
        getInputStream in class java.util.jar.JarFile
        Parameters:
        ze - The Zip or Jar file entry.
        Returns:
        an input stream for reading the contents of the specified zip file entry
        Throws:
        java.io.FileNotFoundException - if the entry isn't found.
      • getByteArray

        public byte[] getByteArray​(java.util.zip.ZipEntry ze)
                            throws java.io.FileNotFoundException
        Returns the byte array of the contents of the specified zip file entry.
        Returns:
        the byte array of the contents of the specified zip file entry
        Throws:
        java.io.FileNotFoundException - if the entry isn't found.
      • getJarEntry

        public java.util.jar.JarEntry getJarEntry​(java.lang.String name)
        Gets the Jar entry with the specified name.
        Specified by:
        getJarEntry in interface IJarFile
        Overrides:
        getJarEntry in class java.util.jar.JarFile
        Parameters:
        name - name of the Jar entry, 'winStyle' parameter applies, i.e. '\' is translated to '/' and the name check is done case insensitive.
        Returns:
        the JarEntry found, or null for not found.
        See Also:
        JarEntry
      • getEntry

        public java.util.zip.ZipEntry getEntry​(java.lang.String name)
        Gets the Zip entry with the specified name.
        Specified by:
        getEntry in interface IJarFile
        Overrides:
        getEntry in class java.util.jar.JarFile
        Parameters:
        name - name of the Zip entry, 'winStyle' parameter applies, i.e. '\' is translated to '/' and the name check is done case insensitive.
        Returns:
        the ZipEntry found, or null for not found.
      • size

        public int size()
        Returns the number of entries in the Jar file.
        Overrides:
        size in class java.util.zip.ZipFile
        Returns:
        the number of entries in the Jar file.
      • getManifest

        public java.util.jar.Manifest getManifest()
        Returns the Jar file manifest, or null if none.
        Specified by:
        getManifest in interface IJarFile
        Overrides:
        getManifest in class java.util.jar.JarFile
        Returns:
        the Jar file manifest, or null if none.
      • getName

        public java.lang.String getName()
        Gets the name of the Jar file. If no name has been assigned using setName, the "real" temporary Jar file name from the temporary directory is returned.
        Specified by:
        getName in interface IJarFile
        Overrides:
        getName in class java.util.zip.ZipFile
        Returns:
        the path name of the Zip/Jar file.
      • setName

        public void setName​(java.lang.String name)
        Sets the name of the Jar file. The getName method will return that name (if non-null), or the "real" temporary Jar file name from the temporary directory if the name parameter is null.
        Parameters:
        name - the name of the Jar file or null to reset it to the "real" temporary Jar file.
      • getEntryData

        public byte[] getEntryData​(java.lang.String name)
        Gets the byte [] data for an entry if present.
        Specified by:
        getEntryData in interface IJarFile
        Parameters:
        name - the name of the entry.
        Returns:
        the byte array or null if not found.
      • getEntryData

        public byte[] getEntryData​(java.util.zip.ZipEntry ze)
        Gets the byte [] data for an entry if present.
        Specified by:
        getEntryData in interface IJarFile
        Parameters:
        ze - the name of the entry.
        Returns:
        the byte array or null if not found.
      • close

        public void close()
                   throws java.io.IOException
        Closes the ZIP file.

        Closing this ZIP file will close all of the input streams previously returned by invocations of the getInputStream method.

        Specified by:
        close in interface java.lang.AutoCloseable
        Specified by:
        close in interface java.io.Closeable
        Specified by:
        close in interface IJarFile
        Overrides:
        close in class java.util.zip.ZipFile
        Throws:
        java.io.IOException - if an I/O error has occurred