java解压缩zip包

package test;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.LinkedList;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
import java.util.zip.ZipOutputStream;

/**
*
* @author liangjw
* @desc 测试java打zip包和解压zip包
* 用java.util.zip下的类会出现乱码,换成org.apache.tools.zip没有乱码
*/
public class MyTestZip {
public static void main(String args[]) throws Exception{
MyTestZip mtz=new MyTestZip();
//mtz.zipFile("f://test", "f://testttt.zip");
mtz.upZipFile("f:\\testttt.zip","f:\\ttt");
}

/**
* 将指定目录压缩
* @param basePath 指定的目录的路径
* @param zipname 压缩后的存放路径
* @throws Exception
*/
public void zipFile(String basePath,String zipname) throws Exception{
ZipEntry ze = null;
byte[] buffer = new byte[1024];
int readLen = 0;
ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(zipname));
for (File file : getFiles(new File(basePath))) {
System.out.println("ziping:" + file.getName());
ze = new ZipEntry(getRelativePath(file,basePath));
ze.setSize(file.length());
ze.setTime(file.lastModified());
zos.putNextEntry(ze);
InputStream in = new BufferedInputStream(new FileInputStream(file));
while ((readLen = in.read(buffer, 0, 1024)) != -1) {
zos.write(buffer, 0, readLen);
}
in.close();
}
zos.close();

}

/**
* 将给定的压缩文件进行解压,放到指定目录
* @param zipFilename 需要解压缩的文件
* @param dir 解压后文件存放的目录
*/
public void upZipFile(String zipFilename,String dir) throws Exception{
ZipInputStream zin=new ZipInputStream(new FileInputStream(zipFilename));
ZipEntry ze=null;
byte[] buf=new byte[1024];
while((ze=zin.getNextEntry())!=null){
System.out.println("unziping:"+ze.getName());
OutputStream os=new BufferedOutputStream(new FileOutputStream(getRealFileName(dir,ze.getName())));
int readLen=0;
while ((readLen=zin.read(buf, 0, 1024))!=-1) {
os.write(buf, 0, readLen);
}
os.close();

}
zin.close();

}

/**
* 根据给定的目录返回该文件夹下所有的文件(包括子目录) 如果给定的是文件则返回该文件
*
* @param file
* 给定的文件目录
* @return 所有文件的列表
*/
private static List<File> getFiles(File fileDir) {
List<File> listFiles = new LinkedList<File>();
// 判断给定的fileDir是否为文件,如果是则直接返回
if (fileDir.isFile()) {
listFiles.add(fileDir);
return listFiles;
}
// 如果是目录则遍历该目录
File[] files = fileDir.listFiles();
for (File file : files) {
if (file.isFile()) {
listFiles.add(file);
} else {
// 对方法进行递归调用
listFiles.addAll(getFiles(file));
}
}
return listFiles;
}

/**
* 给定根目录,返回另一个文件名的相对路径,用于zip文件中的路径
* @param file 实际的文件名
* @param baseDir 根目录
* @return
*/
private static String getRelativePath(File file, String baseDir) {
File base = new File(baseDir);
String filename = file.getName();
while(true){
file = file.getParentFile();
if(file==null)break;
if(file.equals(base))break;
else filename = file.getName() + "/" + filename;
}
return filename;
}

/**
* 给定根目录,返回一个相对路径所对应的实际文件名.
* @param baseDir 指定根目录
* @param absFileName 相对路径名,来自于ZipEntry中的name
* @return java.io.File 实际的文件
*/
public static File getRealFileName(String baseDir, String absFileName){
//判断是否有下级目录,如果没有则将该文件直接new出来
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();
ret=new File(ret, dirs[dirs.length-1]);
return ret;
}
return new File(ret,absFileName);
}

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值