`

[导入]使用org.apache.tools.zip实现zip压缩和解压

    博客分类:
  • Java
阅读更多
import java.io.*;
import org.apache.tools.zip.*;
import java.util.Enumeration;
/**
*功能:zip压缩、解压(支持中文文件名)
*说明:本程序通过使用Apache Ant里提供的zip工具org.apache.tools.zip实现了zip压缩和解压功能.
*   解决了由于java.util.zip包不支持汉字的问题。
*   使用java.util.zip包时,当zip文件中有名字为中文的文件时,
*   就会出现异常:"Exception  in thread "main " java.lang.IllegalArgumentException  
*               at   java.util.zip.ZipInputStream.getUTF8String(ZipInputStream.java:285)
*注意:
*   1、使用时把ant.jar放到classpath中,程序中使用import org.apache.tools.zip.*;
*   2、Apache Ant 下载地址:[url]http://ant.apache.org/[/url]
*   3、Ant ZIP API:[url]http://www.jajakarta.org/ant/ant-1.6.1/docs/mix/manual/api/org/apache/tools/zip/[/url]
*   4、本程序使用Ant 1.7.1 中的ant.jar
*
*仅供编程学习参考.
*
*@author Winty
*@date   2008-8-3
*@Usage:
*   压缩:java AntZip -zip "directoryName"
*   解压:java AntZip -unzip "fileName.zip"
*/


public class AntZip{
    private ZipFile         zipFile;
    private ZipOutputStream zipOut;     //压缩Zip
    private ZipEntry        zipEntry;
    private static int       bufSize;    //size of bytes
    private byte []          buf;
    private int              readedBytes;
    
    public AntZip(){
        this (512);
    }

    public AntZip(int bufSize){
        this .bufSize = bufSize;
        this .buf = new byte [this .bufSize];
    }
    
    //压缩文件夹内的文件
    public void doZip(String zipDirectory){//zipDirectoryPath:需要压缩的文件夹名
        File file;
        File zipDir;

        zipDir = new File(zipDirectory);
        String zipFileName = zipDir.getName() + ".zip" ;//压缩后生成的zip文件名

        try {
            this .zipOut = new ZipOutputStream(new BufferedOutputStream(new FileOutputStream(zipFileName)));
            handleDir(zipDir , this .zipOut);
            this .zipOut.close();
        }catch (IOException ioe){
            ioe.printStackTrace();
        }
    }

    //由doZip调用,递归完成目录文件读取
    private void handleDir(File dir , ZipOutputStream zipOut)throws IOException{
        FileInputStream fileIn;
        File[] files;

        files = dir.listFiles();
    
        if (files.length == 0){//如果目录为空,则单独创建之.
            //ZipEntry的isDirectory()方法中,目录以"/"结尾.
            this .zipOut.putNextEntry(new ZipEntry(dir.toString() + "/" ));
            this .zipOut.closeEntry();
        }
        else {//如果目录不为空,则分别处理目录和文件.
            for (File fileName : files){
                //System.out.println(fileName);

                if (fileName.isDirectory()){
                    handleDir(fileName , this .zipOut);
                }
                else {
                    fileIn = new FileInputStream(fileName);
                    this .zipOut.putNextEntry(new ZipEntry(fileName.toString()));

                    while ((this .readedBytes = fileIn.read(this .buf))>0){
                        this .zipOut.write(this .buf , 0 , this .readedBytes);
                    }

                    this .zipOut.closeEntry();
                }
            }
        }
    }

    //解压指定zip文件
    public void unZip(String unZipfileName){//unZipfileName需要解压的zip文件名
        FileOutputStream fileOut;
        File file;
        InputStream inputStream;

        try {
            this .zipFile = new ZipFile(unZipfileName);

            for (Enumeration entries = this .zipFile.getEntries(); entries.hasMoreElements();){
                ZipEntry entry = (ZipEntry)entries.nextElement();
                file = new File(entry.getName());

                if (entry.isDirectory()){
                    file.mkdirs();
                }
                else {
                    //如果指定文件的目录不存在,则创建之.
                    File parent = file.getParentFile();
                    if (!parent.exists()){
                        parent.mkdirs();
                    }

                    inputStream = zipFile.getInputStream(entry);

                    fileOut = new FileOutputStream(file);
                    while (( this .readedBytes = inputStream.read(this .buf) ) > 0){
                        fileOut.write(this .buf , 0 , this .readedBytes );
                    }
                    fileOut.close();

                    inputStream.close();
                }    
            }
            this .zipFile.close();
        }catch (IOException ioe){
            ioe.printStackTrace();
        }
    }

    //设置缓冲区大小
    public void setBufSize(int bufSize){
        this .bufSize = bufSize;
    }

    //测试AntZip类
    public static void main(String[] args)throws Exception{
        if (args.length==2){
            String name = args[1];
            AntZip zip = new AntZip();

            if (args[0].equals("-zip" ))
                zip.doZip(name);
            else if (args[0].equals("-unzip" ))
                zip.unZip(name);
        }
        else {
            System.out.println("Usage:" );
            System.out.println("压缩:java AntZip -zip directoryName" );
            System.out.println("解压:java AntZip -unzip fileName.zip" );
            throw new Exception("Arguments error!" );
        }
    }
}


文章来源:http://wintys.blog.51cto.com/425414/90878

分享到:
评论

相关推荐

    org.apache.tools.zip.*文件打包需要的jar包

    import org.apache.tools.zip.ZipEntry; import org.apache.tools.zip.ZipFile; import org.apache.tools.zip.ZipOutputStream; 需要的jar包,压缩zip包和解压zip包,远程打包,文件批量下载、文件批量上传

    org.apache.tools.zip.*需要的jar包

    主要使用该jar包中的以下类: org.apache.tools.zip.ZipEntry; org.apache.tools.zip.ZipFile; org.apache.tools.zip.ZipOutputStream;

    org.apache.tools.zip解决解压乱码问题

    import org.apache.tools.zip.ZipEntry; import org.apache.tools.zip.ZipFile; import org.apache.tools.zip.ZipOutputStream; /** * * 类名: ZipUtil.java * 描述:压缩/解压缩zip包处理类 * 创建...

    org.apache.tools.*的jar包,ant-build.jar

    import org.apache.tools.*; import org.apache.tools.zip.ZipEntry; import org.apache.tools.zip.ZipFile; 等

    java压缩中文处理使用org.apache.tools.zip已经打包成jar

    java压缩中文处理使用org.apache.tools.zip已经打包成jar 只要放在LIB文件夹下,然后在JSP 或 JAVA 里引用即可。 <%@ page language="java" import="java.sql.*,java.io.*,org.apache.tools.zip.Zip" pageEncoding=...

    java压缩使用org.apache.tools.zip包解决中文文件名

    使用我自己包,直接放到WEB-INF\classes下解压即可, 在程序中加上 outf.setEncoding("gbk");即可 下面是我的多个文件压缩成一个的压缩,参考 String zipf="D:\\xxx\\xx\\xxb\\xx\\xz.zip"; //---------修改路径---...

    ant-1.7.1(org.apache.tools.zip.ZipOutputStream).zip

    总之,`ant-1.7.1(org.apache.tools.zip.ZipOutputStream).zip`这个压缩包展示了在使用Apache Ant处理包含中文文件名的Zip文件时,如何通过设置正确的字符编码来避免乱码问题。理解和掌握这些知识点对于Java开发者来...

    org.apache.tools.zip

    解压缩ZIP文件主要涉及`java.util.zip.ZipInputStream`和`org.apache.tools.zip.ZipEntry`。以下是一般过程: - 创建`ZipInputStream`对象,基于一个输入流(如FileInputStream),指向ZIP文件。 - 循环读取ZIP...

    org.apache.tools.zip.*和org.apache.commons.httpclient.*实现远程文件打包下载,支持中文文件名

    这篇博客“org.apache.tools.zip.*和org.apache.commons.httpclient.*实现远程文件打包下载,支持中文文件名”探讨了如何利用Apache开源库来实现这个功能。Apache的`tools.zip`和`commons-httpclient`模块为开发者...

    ant.jar下载

    org.apache.tools.zip.ZipFile org.apache.tools.zip.ZipLong org.apache.tools.ant.Executor org.apache.tools.ant.Location org.apache.tools.tar.TarEntry org.apache.tools.tar.TarUtils org.apache.tools...

    org.apache.tools.jar

    解决压缩中文名乱码的jar包

    apache依赖包.zip

    3. **readline-6.2.tar.gz**: readline库提供了命令行输入编辑功能,使得用户在使用Apache的命令行工具时可以方便地进行历史浏览和编辑操作。 4. **pcre-8.41.tar.gz**: PCRE (Perl Compatible Regular Expressions...

    apache-ant-zip-2.3.jar.zip

    Apache Ant Zip 2.3.jar 特别关注的是处理ZIP文件格式的操作,包括创建、解压和操作ZIP档案中的文件。这个特定的版本2.3可能包含了一些特定的修复或功能改进相对于之前的版本。由于在Maven仓库中找不到这个特定的...

    org.apache zip

    标题中的"org.apache.zip"指的是Apache软件基金会下的一个与压缩处理相关的组件,它通常用于Java环境中处理ZIP格式的文件和流。Apache Commons Compress库提供了对多种压缩格式的支持,包括ZIP,而"javamail"则是一...

    java 操作Zip文件(压缩、解压、加密).zip

    这里我们重点讨论使用两个库:`zip4j`和`Apache Ant`来实现这些功能。 1. **zip4j库**:`zip4j-1.3.2.jar`是一个用Java编写的库,它提供了方便的API来处理Zip文件。以下是一些关键功能: - **压缩文件和目录**:你...

    JAVA解压ZIP多层目录文件(需ant.jar

    这种方法利用了Apache Ant库中的`org.apache.tools.zip.ZipFile`类来实现解压功能。在实际应用中,这种方法非常实用,尤其是在需要处理复杂ZIP文件结构的情况下。 #### 方法参数 该方法接受三个参数: 1. **old...

Global site tag (gtag.js) - Google Analytics