`
iamxi
  • 浏览: 191839 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

用apache的ant解压zip文件(中文文件或文件夹解决方法)

阅读更多
昨天在研究用apache的ant包来解压zip文件,把经验写下来与大家分享。
写贴上代码
package upzip;

import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import org.apache.tools.zip.*;
import java.util.Enumeration;

/**
 * 压缩解压ZIP文件
 * @author Administrator
 *
 */
public class AntZip {
    private ZipFile zipFile;
    private static int bufSize;    //size of bytes
    private byte[] buf;
    private int readedBytes;
    
    /**
     * 
     * @param bufSize 缓存大小
     */
    public AntZip(int bufSize){
        this.bufSize = bufSize;
        this.buf = new byte[this.bufSize];
    }
    
    public AntZip(){
        this(1024);
    }
    
    /**
     * 生存目录
     * @param directory 解压文件存放目录
     * @param subDirectory 子目录(没有时可传入空字符串)
     */
    private void createDirectory(String directory, String subDirectory) {
        String dir[];
        File fl = new File(directory);
        try {
            if(subDirectory == "" && fl.exists() != true)
                fl.mkdir();
            else if(subDirectory != ""){
                dir = subDirectory.replace('\\', '/').split("/");
                for (int i = 0; i < dir.length; i++) {
                    File subFile = new File(directory + File.separator + dir[i]);
                    if (subFile.exists() == false)
                        subFile.mkdir();
                    directory += File.separator + dir[i];
                }
            }
        }catch (Exception e){
            e.printStackTrace();
        }
    }
    
    /**
     * 解压指定的ZIP文件
     * @param unZipFileName 文件名字符串(包含路径)
     * @param outputDirectory 解压后存放目录
     */
    public void unZip(String unZipFileName,String outputDirectory){
        FileOutputStream fileOut;   
        //File file;   
        InputStream inputStream;
        
        try{
            createDirectory(outputDirectory,"");
            if(System.getProperty("os.name").toLowerCase().indexOf("windows") >= 0){
            	this.zipFile = new ZipFile(unZipFileName,"GBK");
            }else if(System.getProperty("os.name").toLowerCase().indexOf("linux") >= 0){
                this.zipFile = new ZipFile(unZipFileName,"UTF-8");
            }
            for(Enumeration entries = this.zipFile.getEntries();entries.hasMoreElements();){
                ZipEntry entry = (ZipEntry)entries.nextElement();
                if(entry.isDirectory()){
                    //是目录,则创建之
                    String name = entry.getName().substring(0, entry.getName().length() - 1);
                    File f = new File(outputDirectory + File.separator + name);
                    f.mkdir();
                    //file.mkdirs();
                }else{
                    //是文件
                    String fileName = entry.getName().replace('\\', '/');
                    if (fileName.indexOf("/") != -1){
                        createDirectory(outputDirectory,fileName.substring(0, fileName.lastIndexOf("/")));
                        fileName=fileName.substring(fileName.lastIndexOf("/") + 1,fileName.length());
                    }
                    File f = new File(outputDirectory + File.separator + entry.getName());
                    f.createNewFile();
                    inputStream = zipFile.getInputStream(entry);
                    fileOut = new FileOutputStream(f);
                    while(( this.readedBytes = inputStream.read(this.buf) ) > 0){
                        fileOut.write(this.buf , 0 , this.readedBytes );
                    }
                    fileOut.close();
                    inputStream.close();
                }
            }
            this.zipFile.close();
        }catch(Exception e){
            e.printStackTrace();
        }
    }
    
    /**
     * 解压指定ZIP文件
     * @param unZipFile 需要解压的ZIP文件
     */
    public void unZip(File unZipFile){
        String outputDirectory = new String("D:/ip/"); //解压后存放目录
         unZip(unZipFile.toString(),outputDirectory);
    }
}


遇到的做大问题就是中文文件名。原以为ant支持中文,所以没问题,但实际做下来,发现中文文件名会出现乱码。在网上找了好久,发现原来是和系统有关。中文windows系统默认的字符集是GBK,而ant就不知道用什么字符集在读取文件名了(估计是JAVA默认的字符集)。所以导致了文件名乱码。解决的方法就是ZipFile(unZipFileName,"GBK"),后面加个字符集,可以指定用什么字符集解压zip。Linux下有个问题,Linux系统默认的字符集是UTF-8,可以参照windows下的,用UTF-8做解压的字符集。
if(System.getProperty("os.name").toLowerCase().indexOf("windows") >= 0){
            	this.zipFile = new ZipFile(unZipFileName,"GBK");
            }else if(System.getProperty("os.name").toLowerCase().indexOf("linux") >= 0){
                this.zipFile = new ZipFile(unZipFileName,"UTF-8");
            }

没找到统一的决绝方法,待研究。
在Linux下还有问题,就是从windows系统中拷贝过去的文件带中文名的,在linux下应该使用GBK字符集读取,然后转码成UTF-8。不过,的确Linux下对中文的支持太有问题了。
转码代码参考如下地址的帖子http://jlins.iteye.com/blog/574670
但是如果出现中英文一起的,那就会出现乱码,这个问题没自己看,可能转码代码还不过好。

问题这么多,最后也很无奈,想了个最简单的办法,就是转码后用正则表达式判断是否有中文,如果有,直接换个英文文件名,一切OK。
分享到:
评论
1 楼 钢镚cuicheng 2013-03-14  
好东西,非常感谢~~~~~~~~~~~~~~~

相关推荐

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

    ### JAVA解压ZIP多层目录文件(需ant.jar) #### 概述 本文将详细介绍一个Java方法,该方法用于解压包含多层目录结构的ZIP文件,并能够支持中文文件名。这种方法利用了Apache Ant库中的`org.apache.tools.zip....

    apache-ant-1.6.5-bin.zip_ ant 1.6.5_ant_ant-1.6.5_apache ant win

    这个"apache-ant-1.6.5-bin.zip"文件是Ant的1.6.5版本的二进制发行版,适合在Windows操作系统上使用。Ant是基于Java的,它的主要功能是读取XML格式的构建文件(build.xml),根据其中的指令来编译源代码、运行测试、...

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

    // 使用Apache Ant解压文件 import org.apache.tools.ant.Project; import org.apache.tools.ant.taskdefs.Unzip; Project project = new Project(); Unzip unzipTask = new Unzip(); unzipTask.setSrc(new File(...

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

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

    基于Java向zip压缩包追加文件

    在Java编程中,向现有的ZIP压缩包追加文件通常需要经过解压、修改、再压缩的步骤,因为标准的Java ZIP库(如`java.util.zip`包)并不直接支持追加到已存在的ZIP文件。本篇文章将深入探讨如何实现这个功能,主要关注...

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

    http://mirror.bjtu.edu.cn/apache//ant/source/apache-ant-1.8.2-src.zip 使用我自己包,直接放到WEB-INF\classes下解压即可, 在程序中加上 outf.setEncoding("gbk");即可 下面是我的多个文件压缩成一个的压缩...

    java文件压缩与解压.doc

    解压ZIP文件的过程与压缩过程类似,但是方向相反。主要步骤包括: 1. **创建ZipFile**:使用`ZipFile`对象加载ZIP文件。 2. **遍历ZipEntry**:遍历ZIP文件中的每一个`ZipEntry`。 3. **提取文件**:对于每个`Zip...

    java课程设计之批量压缩文件

    Apache Ant的`ZipTask`可以用来创建、更新或提取ZIP文件,非常适合于批量压缩任务。要使用它,我们需要引入Apache Ant的相关依赖,并在代码中调用其API。 接着,我们看到一个名为`ZipUtil.java`的类,这很可能是...

    ZipUtil.rar

    5. **解压缩ZIP**:解压ZIP文件涉及以下操作: - 创建`ZipInputStream`,读取ZIP文件。 - 使用`getNextEntry()`遍历ZIP文件中的每个条目。 - 对于每个条目,创建一个`File`对象,表示解压后的文件或目录。 - ...

    ant 安装资料 适用于linux

    2. **解压文件**:下载的文件通常是`.tar.gz`或`.zip`格式。在Linux中,你可以使用`tar`命令来解压`.tar.gz`文件。例如: ``` tar -zxvf apache-ant-1.8.3.tar.gz ``` 3. **移动到适当目录**:解压后,将Ant安装...

    java简单压缩算法

    通过使用Apache Ant的`Zip`任务,Java开发者能够轻松地实现文件夹的压缩功能,这不仅简化了代码的复杂性,还提高了代码的可读性和可维护性。无论是为了备份还是为了在网络上传输文件,这种压缩算法都是一个高效且...

    Ant使用指南-Ant入门手册

    2. **解压文件**:将下载的 ZIP 文件解压缩到期望的目录中。 3. **设置环境变量**:将 Ant 的 bin 目录添加到系统的 PATH 环境变量中,使得可以从命令行任意位置调用 Ant 命令。 4. **验证安装**:打开命令提示符或...

    Java操作Ant压缩和解压文件及批量打包Anroid应用

    在这种情况下,引入Apache Ant的`ant.jar`库可以解决这些问题,因为它提供了对中文字符的良好支持和更便捷的压缩与解压缩功能。 Apache Ant是一个基于Java的任务驱动的构建系统,它提供了一系列的任务类,可以用于...

    ANT的常用标签练习

    11. **`&lt;unzip&gt;`**:解压ZIP文件,常用于提取依赖库。 12. **`&lt;antcall&gt;`**:在当前target内部调用另一个target,允许目标间的复用。 13. **`&lt;exec&gt;`**:执行外部程序或脚本,比如执行系统命令或Java应用程序。 #...

    apache-ivy-2.3.0-bin.zip

    通过解压并使用"apache-ivy-2.3.0-bin.zip",你可以轻松地将Ivy集成到你的项目中,无论是Spring框架还是其他任何Java项目,它都能帮助你有效地管理依赖关系,提高开发效率。同时,源码的提供对于学习和定制Ivy的功能...

    apache-mina-2.0.7-src.zip

    从压缩包子文件的文件名称列表"apache-mina-2.0.7"来看,解压后应该会得到一个包含MINA框架源码目录结构的文件夹,里面可能包括以下组成部分: 1. **核心库**:包含MINA的核心组件,如Buffer、Filter、Session、...

    apache-tomcat-10.0.0+lib.zip

    这个压缩包"apache-tomcat-10.0.0+lib.zip"包含了Tomcat 10的源代码,允许开发者深入理解其内部工作原理,并进行自定义或扩展。 源码编译成功的Eclipse项目意味着你可以使用流行的Java集成开发环境Eclipse来探索和...

    FTP服务10 MYCODE.ZIP_ftp

    标题中的"FTP服务10 MYCODE.ZIP_ftp"可能是指一个关于FTP服务器搭建或管理的教程或代码集合,其中"MYCODE"可能是用户自定义的代码库或项目的名称。"10"可能代表该资源是系列教程或版本中的第十个。 在描述中提到的...

Global site tag (gtag.js) - Google Analytics