`

转:JAVA压缩解压ZIP文件,中文乱码还需要ANT.JAR包

阅读更多

原文转载自http://www.cnblogs.com/azhqiang/p/4045963.html

 

package zip;

import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;

import java.util.Enumeration;
import java.util.zip.Deflater;
  
import org.apache.tools.zip.ZipEntry;
import org.apache.tools.zip.ZipFile;
import org.apache.tools.zip.ZipOutputStream;

public class Zip {
    
    public static void main(String[] args){
//        new Zip().doZip("d:/报表程序","e:/报表程序.rar");
        new Zip().unZip("e:/报表程序.rar","d:/报表程序");
    }
    
    private ZipFile         zipFile;
    private ZipOutputStream zipOut;     //压缩Zip
    private  int            bufSize;    //size of bytes
    private byte[]          buf;
  
    public Zip(){
        //要构造函数中去初始化我们的缓冲区  
        this.bufSize = 1024*4;
        this.buf = new byte[this.bufSize];
    }   

    /**
     * 对传入的目录或者是文件进行压缩
     * @param srcFile  需要 压缩的目录或者文件
     * @param destFile 压缩文件的路径
     */
    public void doZip(String srcFile, String destFile) {// zipDirectoryPath:需要压缩的文件夹名
        File zipFile = new File(srcFile);
        try {
            //生成ZipOutputStream,会把压缩的内容全都通过这个输出流输出,最后写到压缩文件中去
            this.zipOut = new ZipOutputStream(new BufferedOutputStream(
                    new FileOutputStream(destFile)));
            //设置压缩的注释  
            zipOut.setComment("comment");
            //设置压缩的编码,如果要压缩的路径中有中文,就用下面的编码
            zipOut.setEncoding("GBK");
            //启用压缩
            zipOut.setMethod(ZipOutputStream.DEFLATED);
  
            //压缩级别为最强压缩,但时间要花得多一点   
            zipOut.setLevel(Deflater.BEST_COMPRESSION);
              
            handleFile(zipFile, this.zipOut,"");
            //处理完成后关闭我们的输出流 
            this.zipOut.close();
        } catch (IOException ioe) {
            ioe.printStackTrace();
        }
    }

    /** 
     *  由doZip调用,递归完成目录文件读取 
     * @param zipFile 
     * @param zipOut 
     * @param dirName  这个主要是用来记录压缩文件的一个目录层次结构的 
     * @throws IOException 
     */  
    private void handleFile(File zipFile, ZipOutputStream zipOut,String dirName) throws IOException {
        System.out.println("遍历文件:"+zipFile.getName());
        //如果是一个目录,则遍历
        if(zipFile.isDirectory()){
            File[] files = zipFile.listFiles();
  
            if (files.length == 0) {// 如果目录为空,则单独创建之.
                //只是放入了空目录的名字
                this.zipOut.putNextEntry(new ZipEntry(dirName+zipFile.getName()+File.separator));
                this.zipOut.closeEntry();
            } else {// 如果目录不为空,则进入递归,处理下一级文件
                for (File file : files) {
                    // 进入递归,处理下一级的文件  
                    handleFile(file, zipOut, dirName+zipFile.getName()+File.separator);
                }
            }
        }else{//如果是文件,则直接压缩
            FileInputStream fileIn  = new FileInputStream(zipFile);
            //放入一个ZipEntry
            this.zipOut.putNextEntry(new ZipEntry(dirName+zipFile.getName()));
            int length = 0;
            //放入压缩文件的流  
            while ((length = fileIn.read(this.buf)) > 0) {
                this.zipOut.write(this.buf, 0, length);
            }  
            //关闭ZipEntry,完成一个文件的压缩
            fileIn.close();
            this.zipOut.closeEntry();
        }              
    }  
  
    /** 
     * 解压指定zip文件 
     * @param unZipfile 压缩文件的路径 
     * @param destFile   解压到的目录  
     */  
    public void unZip(String unZipfile, String destFile) {// unZipfileName需要解压的zip文件名
        FileOutputStream fileOut;
        File file;
        InputStream inputStream;
  
        try {
            //生成一个zip的文件
            this.zipFile = new ZipFile(unZipfile);
            //遍历zipFile中所有的实体,并把他们解压出来
            for (@SuppressWarnings("unchecked")
            Enumeration<ZipEntry> entries = this.zipFile.getEntries(); entries
                    .hasMoreElements();) {
                ZipEntry entry =  entries.nextElement();
                //生成他们解压后的一个文件  
                file = new File(destFile+File.separator+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);
                    int length = 0;
                    //将实体写到本地文件中去
                    while ((length = inputStream.read(this.buf)) > 0) {
                        fileOut.write(this.buf, 0, length);
                    }
                    fileOut.close();
                    inputStream.close();
                }
            }
            this.zipFile.close();
        } catch (IOException ioe) {
            ioe.printStackTrace();
        }
    }
}

 

个人说明:转的这篇主要用来处理文件压缩和解压的。

解决中文乱码问题:

在压缩文件时,可以按照上文说的设置ZipOutputStream的编码即可,如:zipOut.setEncoding("GBK");

在解压缩文件时,有时候压缩包可能是中文的或者压缩包中的文件存在中文名称,解压缩的时候可能会报错也可能不会报错,但是若是压缩包中的文件有中文名称的,解压缩出来的文件绝对会出现乱码(我碰到的就是这种情况,中文的压缩包报错,解压之后里面的中文文件名称全变成乱码啦)。解决方法也很简单,如文中解压方法中的:this.zipFile = new ZipFile(unZipfile);给它设置一个编码,即this.zipFile = new ZipFile(unZipfile,“GBK”)

 

分享到:
评论

相关推荐

    利用ant.jar解压缩zip包

    总的来说,利用Apache Ant的ant.jar库,无论是通过Java代码还是Ant构建文件,都能方便、高效地解压缩ZIP文件,而且对于包含中文文件名的情况,它提供了良好的支持。在实际开发中,理解并熟练运用这类工具可以极大地...

    java压缩zip文件解决中文乱码问题

    在描述中提到的“内置类与jar包”,这可能是指在Java项目中使用第三方库如Apache Ant(ant.jar)来处理压缩任务。Ant是一个强大的构建工具,它包含了处理文件操作,包括压缩和解压的功能。例如,你可以使用Ant的`...

    解决java压缩zip文件时的中文乱码问题(包含jar包和工具类)

    解决java压缩zip文件时的中文乱码问题 实现:java压缩文件成zip实现无乱码。 包括:写好的工具类与jar包。...使用方法:导入ant.jar包,调用CompressExcelOperate中的方法,即可实现压缩文件,并保证没有中文乱码。

    apache-ant-zip.jar

    "apache-ant-zip.jar" 文件是Apache Ant的一个组件,用于处理与ZIP归档相关的任务,特别是针对解决中文乱码问题进行了优化。 在Java中,处理ZIP文件时,必须正确地设置字符编码以确保非ASCII字符(如中文字符)能够...

    解压zip压缩文件,支持多文件目录解压,中文乱码问题

    在使用Java对ZIP压缩文件进行解压的方式中有两种,一种是使用apache提供的ant.jar工具包,但是如果ZIP文件中含有中文名称的文件,在解压后,文件名将出现乱码,另一种是使用Java自身JDK中java.util.zip包下工具类,...

    ant.jar java工具

    `ant.jar`是一个非常重要的工具,尤其对于解决Java处理中文文件时可能出现的乱码问题。本篇文章将深入探讨`ant.jar`的用途、功能以及如何在Java项目中使用它来优化文件压缩操作。 `ant.jar`是Apache Ant的核心库,...

    JDK ZipEntry压缩中文文件名乱码解决

    项目中碰到问题.jdk zipEntry 压缩中文文件名乱码  上网查了下,有两种方法,一种修改jdk ZipInputStream及ZipOutputStream 的源文件,比较麻烦,不建议此项.  第二种 就是拿来主义,因为 开源项目 Ant 里已经有...

    java_zip压缩与解压缩(不支持中文,ant.jar包的下支持)

    在Java标准库中,`java.util.zip`包提供了对ZIP格式文件的支持,包括压缩和解压缩的功能。然而,这个包在处理包含中文文件名的ZIP文件时存在一些问题,可能会导致乱码或无法正确读取。 `java.util.zip`包中的`...

    java解压zip或rar压缩文件(源码和jar包)

    java解压zip或rar压缩文件 包括源码和所需要的jar包:apache ant.jar 和 ...zip文件解压(要使用apache ant.jar以处理中文乱码) rar文件解压(要使用java-unrar-0.3.jar) 具有处理中文乱码功能 代码都有备注,很好懂!

    java解压缩zip代码与用到的jar包

    在Java编程中,处理压缩和解压缩文件是常见的任务,特别是在构建自动化工具、数据传输或者存储优化场景下。本主题将深入讲解如何使用Java来解压缩ZIP文件,并介绍相关库和具体实现方法。 标题提到的"java解压缩zip...

    java压缩(zip)中文问题完美解决

    通过这种方式,Apache Ant的`ant.jar`包可以很好地解决Java标准库在处理中文文件名压缩时可能出现的乱码问题。确保在处理非ASCII字符时正确设置文件和编码,能有效避免类似问题的发生。 此外,如果你在其他Java压缩...

    java压缩文件时的依赖jar包

    标题提到的"java压缩文件时的依赖jar包"很可能指的是用来解决此类问题的特定库。在这种情况下,`ant.jar`是一个关键的角色,它是Apache Ant项目的组成部分,它是一个基于Java的任务执行框架,常用于构建和部署项目,...

    apache-ant-17.0.jar

    总的来说,Apache Ant 1.7.0.jar提供了解决Android ZIP解压中文乱码问题的功能,通过自定义解压字符编码,如设置为UTF-8,可以确保中文文件名在解压缩过程中的正确性。而`ZipEntry`是Java处理ZIP文件的核心类,虽然...

    android解压zip乱码处理(包括ant瘦身后的jar)

    在android开发中,有时候需要将文件打包成zip或将zip解压,如果直接用java.util.zip包下面的类会出现中文乱码,如果直接用org.apache.tools.zip(ant包中的压缩功能)会影响项目的编译时间; 故将ant包中文件瘦身,既...

    java 下载文件 压缩且删除源文件(支持文件夹与文件)

    1、指定文件可下载并且服务器端会删除此文件。 2、指定文件夹(文件夹中必须有一个文件),程序会自动的压缩文件为 zip,然后下载删除源文件与压缩文件...注意一点:中文的文件名会出现乱码(解决方案:导入ant.jar)

    Java压缩文件目录成ZIP包最新技巧

    ### Java压缩文件目录成ZIP包最新技巧 在Java开发中,对文件或目录进行压缩是一项常见且实用的功能。本文将详细介绍如何使用`java.util.zip`包中的类来压缩文件及目录,并解决其中的一个常见问题——中文文件名或...

    antZip1.8.jar

    解决中文文件名乱码的jar.从最新ANT1.8里提取出来打的包

    apache压缩解压zip,支持中文

    总的来说,Apache Commons Compress库是Java开发中处理ZIP压缩格式的理想选择,尤其是当需要处理包含中文或其他非ASCII字符的文件名时。通过使用这个库,你可以确保文件的完整性和编码的准确性,无论文件名是什么...

    分离自Ant的ZIP包可解决中文文件名处理问题

    这个名是名离自ant原码的,由于java.util.zip处理中文文件名时有问题可以用这个包代替那个使用就不会有中文问题了,我加了一个ZipTool.java,这个就是一个示例文件和方法打包文件。 &lt;br&gt;特点: 一、自有原码不...

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

    这个版本包含了对Zip文件格式的支持,其中`org.apache.tools.zip.ZipOutputStream`是Ant用来创建Zip压缩文件的核心类。在处理中文文件名时,可能会遇到乱码问题,这是由于字符编码不一致所导致的。 描述中提到的...

Global site tag (gtag.js) - Google Analytics