zip压缩

package com.camelot.util.mail;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;

import org.apache.tools.zip.ZipEntry;
import org.apache.tools.zip.ZipOutputStream;

public class PackZip {

public static void main(String[] args) {

//需要压缩得文件夹
File[] files ={
new File("C:/Users/Administrator/Desktop/1")
};
//压缩后的地址 和名称
File targetFile = new File("C:/Users/Administrator/Desktop/1.zip");
//开始压缩
try {
zip(files,targetFile);
} catch (IOException e) {
}
}
public static int zip(File[] files,File targetFile) throws IOException{
int flag = 0;
files = toAbs(files);//String parentPath = files[0].getAbsoluteFile().getParent();
targetFile = targetFile.getAbsoluteFile();//得到绝对路径
String parentPath = files[0].getParent()+"\";//得到父路径

files = eachFiles(files);
ZipOutputStream zos = new ZipOutputStream(targetFile);
zos.setEncoding("utf-8");
try{
byte[] buf = new byte[1024*1024];
for(File f:files){
zipFile(f,zos,parentPath,buf);
}
flag = 1;
} finally{
zos.close();
}
return flag ;
}
private static File[] toAbs(File[] files) {
ArrayList<File> list = new ArrayList<>();
for(File f:files){
list.add(f.getAbsoluteFile());
}
return list.toArray(new File[0]);
}
private static File[] eachFiles(File[] files) {
List<File> list = new ArrayList<>();
LinkedList<File> tasks = new LinkedList<File>(Arrays.asList(files));
while( !tasks.isEmpty() ) {
// System.out.println(tasks);
File task = tasks.remove();
list.add(task);
System.out.println(task+"-----开始");
if( !task.isDirectory() ) {
System.out.println(task+"-----结束");
continue;
}
for( File c : task.listFiles() ){
tasks.add(c);
}
System.out.println(task+"-----结束");
}
return list.toArray(new File[0]);
}
public static void zipFile(File f, ZipOutputStream zos, String parentPath, byte[] buf) throws IOException {
String filename = f.toString().replace(parentPath, "");
if(f.isDirectory()){//关键
filename+="/";
}
ZipEntry ze = new ZipEntry(filename);
zos.putNextEntry(ze);
try{
if(f.isFile()){
doZip(f,zos,buf);
}
}finally{
zos.closeEntry();
}
}
private static void doZip(File f, ZipOutputStream zos, byte[] buf) throws IOException {
FileInputStream fis = new FileInputStream(f);
int len;
try{
zos.setEncoding("gbk");
while((len=fis.read(buf))!=-1){
zos.write(buf, 0, len);
}
}finally{
fis.close();
}
}
}

原文地址:https://www.cnblogs.com/whb11/p/6375856.html