使用java语言实现Zip文件压缩和解压
import java.io.BufferedInputStream;
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.io.OutputStream;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
import org.apache.tools.zip.*;
public class ZipToFile {
public static final int BUFFER = 1024 ;//缓存大小
/**
* zip压缩功能.
* 压缩baseDir(文件夹目录)下所有文件,包括子目录
* @throws Exception
*/
public static void zipFile(String baseDir,String fileName) throws Exception{
List fileList=getSubFiles(new File(baseDir));
ZipOutputStream zos=new ZipOutputStream(new FileOutputStream(fileName));
ZipEntry ze=null;
byte[] buf=new byte[BUFFER];
int readLen=0;
for(int i = 0; i <fileList.size(); i++) {
File f=(File)fileList.get(i);
ze=new ZipEntry(getAbsFileName(baseDir, f));
ze.setSize(f.length());
ze.setTime(f.lastModified());
zos.putNextEntry(ze);
InputStream is=new BufferedInputStream(new FileInputStream(f));
while ((readLen=is.read(buf, 0, BUFFER))!=-1) {
zos.write(buf, 0, readLen);
}
is.close();
}
zos.close();
}
/**
* 给定根目录,返回另一个文件名的相对路径,用于zip文件中的路径.
* @param baseDir java.lang.String 根目录
* @param realFileName java.io.File 实际的文件名
* @return 相对文件名
*/
private static String getAbsFileName(String baseDir, File realFileName){
File real=realFileName;
File base=new File(baseDir);
String ret=real.getName();
while (true) {
real=real.getParentFile();
if(real==null)
break;
if(real.equals(base))
break;
else
ret=real.getName()+"/"+ret;
}
return ret;
}
/**
* 取得指定目录下的所有文件列表,包括子目录.
* @param baseDir File 指定的目录
* @return 包含java.io.File的List
*/
private static List getSubFiles(File baseDir){
List ret=new ArrayList();
File[] tmp=baseDir.listFiles();
for (int i = 0; i <tmp.length; i++) {
if(tmp[i].isFile())
ret.add(tmp[i]);
if(tmp[i].isDirectory())
ret.addAll(getSubFiles(tmp[i]));
}
return ret;
}
/**
* 解压缩功能.
* 将zipFileName文件解压到zipDir目录下.
* @throws Exception
*/
public static void unZipFile(String zipFileName,String zipDir) throws Exception{
ZipFile zfile=new ZipFile(zipFileName);
//Enumeration zList=zfile.entries();
Enumeration zList=zfile.getEntries();
ZipEntry ze=null;
byte[] buf=new byte[BUFFER];
while(zList.hasMoreElements()){
ze=(ZipEntry)zList.nextElement();
if(ze.isDirectory()){
File f=new File(zipDir+ze.getName());
f.mkdir();
continue;
}
OutputStream os=new BufferedOutputStream(new FileOutputStream(getRealFileName(zipDir, ze.getName())));
InputStream is=new BufferedInputStream(zfile.getInputStream(ze));
int readLen=0;
while ((readLen=is.read(buf, 0, BUFFER))!=-1) {
os.write(buf, 0, readLen);
}
is.close();
os.close();
}
zfile.close();
}
/**
* 给定根目录,返回一个相对路径所对应的实际文件名.
* @param baseDir 指定根目录
* @param absFileName 相对路径名,来自于ZipEntry中的name
* @return java.io.File 实际的文件
*/
public static File getRealFileName(String baseDir, String absFileName){
String[] dirs=absFileName.split("/");
File ret=new File(baseDir);
if(dirs.length>1){
for (int i = 0; i < dirs.length-1;i++) {
ret=new File(ret, dirs[i]);
}
if(!ret.exists()){
ret.mkdirs();
}
}
return new File(ret, dirs[dirs.length-1]);
}
public static void main(String args[]) throws Exception{
//压缩测试
/*zipFile("res/test/","res/zip/test.zip");
System.out.println("压缩完毕!");*/
//解压测试
unZipFile("res/zip/test.zip","res/dir1/");
System.out.println("解压完毕!");
}
}
注:1、import org.apache.tools.zip.*; 如果提示错误则需要下载对应的zip插件,再导入到工程中
2、此代码虽然可以实现文件的压缩或者解压,但是进行压缩后再解压会出现错误,代码还需完善
参考文章地址:http://orz.iteye.com/blog/110842