⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 jarwriter.java

📁 ProGuard 是一个免费的 Java类文件的压缩
💻 JAVA
字号:
/* * ProGuard -- shrinking, optimization, obfuscation, and preverification *             of Java bytecode. * * Copyright (c) 2002-2007 Eric Lafortune (eric@graphics.cornell.edu) * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the Free * Software Foundation; either version 2 of the License, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */package proguard.io;import java.io.*;import java.util.jar.*;import java.util.*;import java.util.zip.*;/** * This DataEntryWriter sends data entries to a given jar/zip file. * The manifest and comment properties can optionally be set. * * @author Eric Lafortune */public class JarWriter implements DataEntryWriter, Finisher{    private DataEntryWriter dataEntryWriter;    private Manifest        manifest;    private String          comment;    private OutputStream    currentParentOutputStream;    private ZipOutputStream currentJarOutputStream;    private Finisher        currentFinisher;    private String          currentEntryName;    // The names of the jar entries that are already in the jar.    private Set jarEntryNames = new HashSet();    /**     * Creates a new JarWriter without manifest or comment.     */    public JarWriter(DataEntryWriter dataEntryWriter)    {        this(dataEntryWriter, null, null);    }    /**     * Creates a new JarWriter.     */    public JarWriter(DataEntryWriter dataEntryWriter,                     Manifest        manifest,                     String          comment)    {        this.dataEntryWriter = dataEntryWriter;        this.manifest        = manifest;        this.comment         = comment;    }    // Implementations for DataEntryWriter.    public OutputStream getOutputStream(DataEntry dataEntry) throws IOException    {        return getOutputStream(dataEntry,  null);    }    public OutputStream getOutputStream(DataEntry dataEntry,                                        Finisher  finisher) throws IOException    {        // Get the parent stream, new or exisiting.        // This may finish our own jar output stream.        OutputStream parentOutputStream =            dataEntryWriter.getOutputStream(dataEntry.getParent(), this);        // Did we get a stream?        if (parentOutputStream == null)        {            return null;        }        // Do we need a new stream?        if (currentParentOutputStream == null)        {            currentParentOutputStream = parentOutputStream;            // Create a new jar stream, with a manifest, if set.            currentJarOutputStream = manifest != null ?                new JarOutputStream(parentOutputStream, manifest) :                new ZipOutputStream(parentOutputStream);            // Add a comment, if set.            if (comment != null)            {                currentJarOutputStream.setComment(comment);            }        }        // Get the entry name.        String name = dataEntry.getName();        // Do we need a new entry?        if (!name.equals(currentEntryName))        {            // Close the previous ZIP entry, if any.            closeEntry();            // We have to check if the name is already used, because ZipOutputStream            // doesn't handle this case properly (it throws an exception which can            // be caught, but the ZipDataEntry is remembered anyway).            if (!jarEntryNames.add(name))            {                throw new IOException("Duplicate zip entry ["+dataEntry+"]");            }            // Create a new entry.            currentJarOutputStream.putNextEntry(new ZipEntry(name));            currentFinisher  = finisher;            currentEntryName = name;        }        return currentJarOutputStream;    }    public void finish() throws IOException    {        // Finish the entire ZIP stream, if any.        if (currentJarOutputStream != null)        {            // Close the previous ZIP entry, if any.            closeEntry();            // Finish the entire ZIP stream.            currentJarOutputStream.finish();            currentJarOutputStream    = null;            currentParentOutputStream = null;            jarEntryNames.clear();        }    }    public void close() throws IOException    {        // Close the parent stream.        dataEntryWriter.close();    }    // Small utility methods.    /**     * Closes the previous ZIP entry, if any.     */    private void closeEntry() throws IOException    {        if (currentEntryName != null)        {            // Let any finisher finish up first.            if (currentFinisher != null)            {                currentFinisher.finish();                currentFinisher = null;            }            currentJarOutputStream.closeEntry();            currentEntryName = null;        }    }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -