package Util;
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.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
import java.util.zip.ZipOutputStream;
public class ZipUtil {
private static ZipUtil ziputil=new ZipUtil();
public static ZipUtil getInstance(){
return ziputil;
}
/**测试用例
* @param args
*/
public static void main(String[] args) {
try {
// ZipUtil.zip(new String[]{"D:\\zip\\TestSub.txt"}, "D:\\zip\\ziptest.zip");
// ZipUtil.unzip("D:\\zip\\ziptest.zip", "D:\\zip");
// ZipUtil.getInstance().zip("D:\\zipsource.rar", "D:\\zip");
ZipUtil.getInstance().unzipDirectory("D:\\zipsource.rar", "D:\\zip");
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 文件压缩
* @param files 要解压缩的文件
* @param destZip 压缩之后的zip文件所放的目录,需要"D:\\"或"D:\\test\"格式
* @throws IOException
*/
public static void zip(String[] files, String destZip) throws IOException {
FileOutputStream fos = new FileOutputStream(destZip);
BufferedOutputStream bos = new BufferedOutputStream(fos);
ZipOutputStream zos = new ZipOutputStream(bos);
for (int i = 0; i < files.length; i++) {
String file = files[i];
FileInputStream fis = new FileInputStream(file);
BufferedInputStream bis = new BufferedInputStream(fis);
File f = new File(file);
ZipEntry zl = new ZipEntry(f.getName());
zos.putNextEntry(zl);
int tmp = -1;
while ((tmp = bis.read()) != -1) {
zos.write(tmp);
}
zos.closeEntry();
bis.close();
fis.close();
}
zos.close();
bos.close();
fos.close();
}
/**
* 文件解压缩
* @param zipfile 要解压缩的zip文件
* @param destpath 解压后文件所放的目录,需要“D:\\”或“D:\\test”格式
* @throws IOException
*/
public static void unzip(String zipfile,String destpath) throws IOException{
FileInputStream fis=new FileInputStream(zipfile);
ZipInputStream zis=new ZipInputStream(fis);
ZipEntry zl=null;
while((zl=zis.getNextEntry())!=null){
if(zl.isDirectory()){
// destpath+="\\"+zl.getName();
File f=new File(destpath+"\\"+zl.getName());
f.mkdirs();
}else{
String file=zl.getName();
FileOutputStream fos=new FileOutputStream(destpath+"\\"+file);
int tmp=-1;
while((tmp=zis.read())!=-1)
{
fos.write(tmp);
}
zis.closeEntry();
fos.close();
}
}
zis.close();
}
/**
* 压缩目录
* @param zipFileName 压缩后zip文件的路径
* @param inputFile 需要压缩的源目录
* @throws IOException
*/
public void zip(String zipFileName,String inputFile) throws IOException{
File file=new File(inputFile);
ZipOutputStream out=new ZipOutputStream(new FileOutputStream(zipFileName));
zip(out,file,"");
System.out.println("zip done");
out.close();
}
/**
*递归遍历子目录和文件,进行压缩
* @param out
* @param f
* @param base
* @throws IOException
*/
private void zip(ZipOutputStream out, File f, String base) throws IOException {
System.out.println("Zipping"+f.getName());
if(f.isDirectory()){
File[] fl=f.listFiles();
out.putNextEntry(new ZipEntry(base+"/"));
base=base.length()==0?"":base+"/";
for(int i=0;i<fl.length;i++){
zip(out,fl[i],base+fl[i].getName());
}
}else{
out.putNextEntry(new ZipEntry(base));
FileInputStream in=new FileInputStream(f);
int b;
while((b=in.read())!=-1){
out.write(b);
}
in.close();
}
}
/**
* 解压缩目录
* @param zipFileName 需要压缩的文件
* @param outputDirectory 解压缩后文件所放路径
* @throws Exception
*/
public void unzipDirectory(String zipFileName,String outputDirectory) throws Exception{
ZipInputStream in=new ZipInputStream(new FileInputStream(zipFileName));
ZipEntry z;
while((z=in.getNextEntry())!=null){
System.out.println("unziping "+z.getName());
if(z.isDirectory()){
String name=z.getName();
name=name.substring(0, name.length()-1);
File f=new File(outputDirectory+File.separator+name);
f.mkdirs();
System.out.println("mkdir "+outputDirectory+File.separator+name);
}else{
File f=new File(outputDirectory+File.separator+z.getName());
f.createNewFile();
FileOutputStream out=new FileOutputStream(f);
int b;
while((b=in.read())!=-1){
out.write(b);
}
out.close();
}
}
in.close();
}
}