昨天在研究用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。
分享到:
相关推荐
### JAVA解压ZIP多层目录文件(需ant.jar) #### 概述 本文将详细介绍一个Java方法,该方法用于解压包含多层目录结构的ZIP文件,并能够支持中文文件名。这种方法利用了Apache Ant库中的`org.apache.tools.zip....
这个"apache-ant-1.6.5-bin.zip"文件是Ant的1.6.5版本的二进制发行版,适合在Windows操作系统上使用。Ant是基于Java的,它的主要功能是读取XML格式的构建文件(build.xml),根据其中的指令来编译源代码、运行测试、...
// 使用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(...
在使用Java对ZIP压缩文件进行解压的方式中有两种,一种是使用apache提供的ant.jar工具包,但是如果ZIP文件中含有中文名称的文件,在解压后,文件名将出现乱码,另一种是使用Java自身JDK中java.util.zip包下工具类,...
在Java编程中,向现有的ZIP压缩包追加文件通常需要经过解压、修改、再压缩的步骤,因为标准的Java ZIP库(如`java.util.zip`包)并不直接支持追加到已存在的ZIP文件。本篇文章将深入探讨如何实现这个功能,主要关注...
http://mirror.bjtu.edu.cn/apache//ant/source/apache-ant-1.8.2-src.zip 使用我自己包,直接放到WEB-INF\classes下解压即可, 在程序中加上 outf.setEncoding("gbk");即可 下面是我的多个文件压缩成一个的压缩...
解压ZIP文件的过程与压缩过程类似,但是方向相反。主要步骤包括: 1. **创建ZipFile**:使用`ZipFile`对象加载ZIP文件。 2. **遍历ZipEntry**:遍历ZIP文件中的每一个`ZipEntry`。 3. **提取文件**:对于每个`Zip...
Apache Ant的`ZipTask`可以用来创建、更新或提取ZIP文件,非常适合于批量压缩任务。要使用它,我们需要引入Apache Ant的相关依赖,并在代码中调用其API。 接着,我们看到一个名为`ZipUtil.java`的类,这很可能是...
5. **解压缩ZIP**:解压ZIP文件涉及以下操作: - 创建`ZipInputStream`,读取ZIP文件。 - 使用`getNextEntry()`遍历ZIP文件中的每个条目。 - 对于每个条目,创建一个`File`对象,表示解压后的文件或目录。 - ...
2. **解压文件**:下载的文件通常是`.tar.gz`或`.zip`格式。在Linux中,你可以使用`tar`命令来解压`.tar.gz`文件。例如: ``` tar -zxvf apache-ant-1.8.3.tar.gz ``` 3. **移动到适当目录**:解压后,将Ant安装...
通过使用Apache Ant的`Zip`任务,Java开发者能够轻松地实现文件夹的压缩功能,这不仅简化了代码的复杂性,还提高了代码的可读性和可维护性。无论是为了备份还是为了在网络上传输文件,这种压缩算法都是一个高效且...
2. **解压文件**:将下载的 ZIP 文件解压缩到期望的目录中。 3. **设置环境变量**:将 Ant 的 bin 目录添加到系统的 PATH 环境变量中,使得可以从命令行任意位置调用 Ant 命令。 4. **验证安装**:打开命令提示符或...
在这种情况下,引入Apache Ant的`ant.jar`库可以解决这些问题,因为它提供了对中文字符的良好支持和更便捷的压缩与解压缩功能。 Apache Ant是一个基于Java的任务驱动的构建系统,它提供了一系列的任务类,可以用于...
11. **`<unzip>`**:解压ZIP文件,常用于提取依赖库。 12. **`<antcall>`**:在当前target内部调用另一个target,允许目标间的复用。 13. **`<exec>`**:执行外部程序或脚本,比如执行系统命令或Java应用程序。 #...
通过解压并使用"apache-ivy-2.3.0-bin.zip",你可以轻松地将Ivy集成到你的项目中,无论是Spring框架还是其他任何Java项目,它都能帮助你有效地管理依赖关系,提高开发效率。同时,源码的提供对于学习和定制Ivy的功能...
从压缩包子文件的文件名称列表"apache-mina-2.0.7"来看,解压后应该会得到一个包含MINA框架源码目录结构的文件夹,里面可能包括以下组成部分: 1. **核心库**:包含MINA的核心组件,如Buffer、Filter、Session、...
这个压缩包"apache-tomcat-10.0.0+lib.zip"包含了Tomcat 10的源代码,允许开发者深入理解其内部工作原理,并进行自定义或扩展。 源码编译成功的Eclipse项目意味着你可以使用流行的Java集成开发环境Eclipse来探索和...
标题中的"FTP服务10 MYCODE.ZIP_ftp"可能是指一个关于FTP服务器搭建或管理的教程或代码集合,其中"MYCODE"可能是用户自定义的代码库或项目的名称。"10"可能代表该资源是系列教程或版本中的第十个。 在描述中提到的...