这几天需要用到java来操作压缩文件的解压。
在网上找了很多种办法,一种是用java util 的zip包,但是试了一下,发现对于有中文名字的文件名或者目录名就直接乱码和报错了。那特么的那些人直接用util写的有毛用呀,就算程序猿都知道路径名最好不用中文名,那文件名至少可以要有吧!而且广大用户也是小白呀,必须妥妥的上中文呀!
然后搜了一下解决办法,一种说是修改java util zip包的源码,把源码导出来,然后修改字符编码后另外再压一个包引用,感觉直接修改好像不是很好的样子。
接下来的就是用阿帕奇的ant.jar 包了,这个包的zip包封装了跟java源码相同的类,所以对于压缩和解压的操作,跟源码类似。于是下载了蚂蚁包(ant),直接在网上找了例子,然后试了一下,就发现可以了。
以下的例子是参照 —张飞的博客 稍微优化了一丢丢。maker 一下吧~ 迟早要再用的,忘了说了,这个用的是apache-ant.jar 版本号为1.70 看了一下低版本的比如说是1.56不是这个做法。还是注意下1.70版本的吧
import java.io.FileOutputStream;
import java.io.InputStream;
import java.util.Enumeration;
import org.apache.tools.ant.Project;
import org.apache.tools.ant.taskdefs.Zip;
import org.apache.tools.ant.types.FileSet;
import org.apache.tools.zip.ZipEntry;
import org.apache.tools.zip.ZipFile;
public class Demo {
private final int buffer = 1024;
public static void main(String args[]){
String filePath="f://myTemplate.zip";
String descDir="f://demo//";
Demo d=new Demo();
d.unZip(filePath,descDir);
}
/**
* 压缩文件
* @param srcDirName
* @param zipFilePath
* @return
*/
public boolean zip(String srcDirName, String zipFilePath) {
boolean flag = false;
try {
File srcdir = new File(srcDirName);
if (!srcdir.exists())
throw new RuntimeException(srcDirName + " is not exist!");
Project prj = new Project();
Zip zip_ = new Zip();
zip_.setProject(prj);
zip_.setDestFile(new File(zipFilePath));
FileSet fileSet = new FileSet();
fileSet.setProject(prj);
fileSet.setDir(srcdir);
zip_.addFileset(fileSet);
zip_.execute();
flag = true;
System.out.println("zip finished");
} catch (Exception ex) {
System.out.println(ex.getMessage());
}
return flag;
}
/**
* 解压压缩包
* @param zipFilePath
* @param outputDirectory
* @return
*/
public boolean unZip(String zipFilePath, String outputDirectory) {
boolean flag = false;
try {
ZipFile zipFile = new ZipFile(zipFilePath);
@SuppressWarnings("rawtypes")
Enumeration e = zipFile.getEntries();
ZipEntry zipEntry = null;
createDirectory(outputDirectory, "");
while (e.hasMoreElements()) {
zipEntry = (ZipEntry) e.nextElement();
System.out.println("unzip " + zipEntry.getName());
//如果解压目标是目录的话直接创建目录
if (zipEntry.isDirectory()) {
String name = zipEntry.getName().trim();
name = name.substring(0, name.length() - 1);
File f = new File(outputDirectory + File.separator + name);
if (!f.exists()) {
f.mkdir();
}
} else {
String fileName = zipEntry.getName();
fileName = fileName.replace('\\', '/');
if (fileName.indexOf("/") != -1) {
createDirectory(outputDirectory, fileName.substring(0,
fileName.lastIndexOf("/")));
fileName = fileName
.substring(fileName.lastIndexOf("/") + 1);
}
File f = new File(outputDirectory + File.separator+zipEntry.getName());
f.createNewFile();
InputStream in = zipFile.getInputStream(zipEntry);
FileOutputStream out = new FileOutputStream(f);
byte[] by = new byte[buffer];
int c=0;
while ((c = in.read(by)) != -1) {
out.write(by, 0, c);
}
in.close();
out.close();
}
}
flag = true;
} catch (Exception ex) {
System.out.println(ex.getMessage());
}
return flag;
}
/**
* 创建目录
* @param directory
* @param subDirectory
*/
private void createDirectory(String directory, String subDirectory) {
String dir[];
File fl = new File(directory);
try {
if (subDirectory == "" && !fl.exists()) {
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()) {
subFile.mkdir();
}
directory += File.separator + dir[i];
}
}
} catch (Exception ex) {
System.out.println(ex.getMessage());
}
}
}