📄 jarfile.java
字号:
/* * @(#)JarFile.java 1.50 03/01/23 * * Copyright 2003 Sun Microsystems, Inc. All rights reserved. * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. */package java.util.jar;import java.io.*;import java.util.*;import java.util.zip.*;import java.security.cert.Certificate;import java.security.AccessController;import sun.security.action.GetPropertyAction;import sun.security.util.ManifestEntryVerifier;import sun.misc.SharedSecrets;/** * The <code>JarFile</code> class is used to read the contents of a JAR file * from any file that can be opened with <code>java.io.RandomAccessFile</code>. * It extends the class <code>java.util.zip.ZipFile</code> with support * for reading an optional <code>Manifest</code> entry. The * <code>Manifest</code> can be used to specify meta-information about the * JAR file and its entries. * * @author David Connelly * @version 1.50, 01/23/03 * @see Manifest * @see java.util.zip.ZipFile * @see java.util.jar.JarEntry * @since 1.2 */publicclass JarFile extends ZipFile { private Manifest man; private JarEntry manEntry; private boolean manLoaded; private JarVerifier jv; private boolean jvInitialized; private boolean verify; private boolean computedHasClassPathAttribute; private boolean hasClassPathAttribute; // Set up JavaUtilJarAccess in SharedSecrets static { SharedSecrets.setJavaUtilJarAccess(new JavaUtilJarAccessImpl()); } /** * The JAR manifest file name. */ public static final String MANIFEST_NAME = "META-INF/MANIFEST.MF"; /** * Creates a new <code>JarFile</code> to read from the specified * file <code>name</code>. The <code>JarFile</code> will be verified if * it is signed. * @param name the name of the JAR file to be opened for reading * @exception IOException if an I/O error has occurred * @exception SecurityException if access to the file is denied * by the SecurityManager */ public JarFile(String name) throws IOException { this(new File(name), true, ZipFile.OPEN_READ); } /** * Creates a new <code>JarFile</code> to read from the specified * file <code>name</code>. * @param name the name of the JAR file to be opened for reading * @param verify whether or not to verify the JarFile if * it is signed. * @exception IOException if an I/O error has occurred * @exception SecurityException if access to the file is denied * by the SecurityManager */ public JarFile(String name, boolean verify) throws IOException { this(new File(name), verify, ZipFile.OPEN_READ); } /** * Creates a new <code>JarFile</code> to read from the specified * <code>File</code> object. The <code>JarFile</code> will be verified if * it is signed. * @param file the JAR file to be opened for reading * @exception IOException if an I/O error has occurred * @exception SecurityException if access to the file is denied * by the SecurityManager */ public JarFile(File file) throws IOException { this(file, true, ZipFile.OPEN_READ); } /** * Creates a new <code>JarFile</code> to read from the specified * <code>File</code> object. * @param file the JAR file to be opened for reading * @param verify whether or not to verify the JarFile if * it is signed. * @exception IOException if an I/O error has occurred * @exception SecurityException if access to the file is denied * by the SecurityManager. */ public JarFile(File file, boolean verify) throws IOException { this(file, verify, ZipFile.OPEN_READ); } /** * Creates a new <code>JarFile</code> to read from the specified * <code>File</code> object in the specified mode. The mode argument * must be either <tt>OPEN_READ</tt> or <tt>OPEN_READ | OPEN_DELETE</tt>. * * @param file the JAR file to be opened for reading * @param verify whether or not to verify the JarFile if * it is signed. * @param mode the mode in which the file is to be opened * @exception IOException if an I/O error has occurred * @exception IllegalArgumentException * If the <tt>mode</tt> argument is invalid * @exception SecurityException if access to the file is denied * by the SecurityManager */ public JarFile(File file, boolean verify, int mode) throws IOException { super(file, mode); this.verify = verify; } /** * Returns the JAR file manifest, or <code>null</code> if none. * * @return the JAR file manifest, or <code>null</code> if none */ public Manifest getManifest() throws IOException { if (!manLoaded) { // First look up manifest entry using standard name manEntry = getJarEntry(MANIFEST_NAME); if (manEntry == null) { // If not found, then iterate through all the "META-INF/" // entries to find a match. String[] names = getMetaInfEntryNames(); if (names != null) { for (int i = 0; i < names.length; i++) { if (MANIFEST_NAME.equals( names[i].toUpperCase(Locale.ENGLISH))) { manEntry = getJarEntry(names[i]); break; } } } } // If found then load the manifest if (manEntry != null) { if (verify) { byte[] b = getBytes(manEntry); man = new Manifest(new ByteArrayInputStream(b)); jv = new JarVerifier(man, b); } else { man = new Manifest(super.getInputStream(manEntry)); } } manLoaded = true; } return man; } private native String[] getMetaInfEntryNames(); /** * Returns the <code>JarEntry</code> for the given entry name or * <code>null</code> if not found. * * @param name the JAR file entry name * @return the <code>JarEntry</code> for the given entry name or * <code>null</code> if not found. * @see java.util.jar.JarEntry */ public JarEntry getJarEntry(String name) { return (JarEntry)getEntry(name); } /** * Returns the <code>ZipEntry</code> for the given entry name or * <code>null</code> if not found. * * @param name the JAR file entry name * @return the <code>ZipEntry</code> for the given entry name or * <code>null</code> if not found * @see java.util.zip.ZipEntry */ public ZipEntry getEntry(String name) { ZipEntry ze = super.getEntry(name); if (ze != null) { return new JarFileEntry(ze); } return null; } /** * Returns an enumeration of the ZIP file entries. */ public Enumeration entries() { final Enumeration enum = super.entries(); return new Enumeration() { public boolean hasMoreElements() { return enum.hasMoreElements(); } public Object nextElement() { ZipEntry ze = (ZipEntry)enum.nextElement(); return new JarFileEntry(ze); } }; } private class JarFileEntry extends JarEntry { JarFileEntry(ZipEntry ze) { super(ze); } public Attributes getAttributes() throws IOException { Manifest man = JarFile.this.getManifest(); if (man != null) { return man.getAttributes(getName()); } else { return null; } } public java.security.cert.Certificate[] getCertificates() { try { maybeInstantiateVerifier(); } catch (IOException e) { throw new RuntimeException(e); } if (certs == null && jv != null) { Certificate[] cs = jv.getCerts(getName()); if (cs != null) { certs = (Certificate[])cs.clone();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -