根据文件目录实现文件的压缩与解压
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
import java.util.zip.ZipOutputStream;
public class ZipFile {
public static void main(String[] args) {
//压缩测试
// int count = doZip("D:\\Personality\\pdf\\zipTest", "myZip.zip");
//解压测试
int count = unzip("D:\\Personality\\pdf\\zipTest", "myZip.zip");
System.out.println(count);
}
/** 缓冲器大小 */
private static final int BUFFER = 1024;
/**
* decompression
* @param srcPath 待解压文件路径
* @param zipFileName 带解压文件名称
* @return 解压文件个数
*/
public static int unzip( String srcPath,String zipFileName) {
ZipInputStream zipInputStream = null;
//ZIP文件入口
ZipEntry zipEntry = null;
//缓冲区
byte[] buffer = new byte[BUFFER];
// 本次读出来的长度
int readLength = 0;
//解压文件个数
int count = 0;
try {
zipInputStream = new ZipInputStream(new FileInputStream(srcPath+"//"+zipFileName));
while ((zipEntry = zipInputStream.getNextEntry()) != null) {
// 若是ZIP条目目录,则需创建这个目录
if (zipEntry.isDirectory()) {
File dir = new File(srcPath + "/" + zipEntry.getName());
if (!dir.exists()) {
dir.mkdirs();
continue;
}
}
// 若是文件,则需创建该文件
File file = createFile(srcPath, zipEntry.getName());
count++;
OutputStream outputStream = new FileOutputStream(file);
while ((readLength = zipInputStream.read(buffer, 0, BUFFER)) != -1) {
outputStream.write(buffer, 0, readLength);
}
outputStream.close();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
return -1;
} catch (IOException e) {
e.printStackTrace();
return -2;
} finally {
//关闭流
try {
if (zipInputStream != null)
zipInputStream.close();
} catch (IOException e) {
e.printStackTrace();
return -2;
}
}
return count;
}
/**
* compression
* @param srcPath 待压缩文件目录
* @param zipFileName 压缩后文件名称
* @return 压缩文件个数
*/
public static int doZip(String srcPath, String zipFileName) {
File srcFile = new File(srcPath);
//通过路径获取文件集合
List <File> fileList = getAllFiles(srcFile);
//缓冲区
byte[] buffer = new byte[BUFFER];
//ZIP文件入口
ZipEntry zipEntry = null;
//本次读取长度
int readLength = 0;
ZipOutputStream zipOutputStream = null;
//压缩后文件的名称
String newZipFileName;
//压缩文件总个数
int count = 0;
if(zipFileName==null||zipFileName.length()==0) {
newZipFileName= srcPath+"newZip.zip";
}else {
newZipFileName = srcPath+"\\"+zipFileName;
}
try {
zipOutputStream = new ZipOutputStream(new FileOutputStream(newZipFileName));
for (File file : fileList) {
// 若是文件,则压缩这个文件
if (file.isFile()) {
count++;
zipEntry = new ZipEntry(getRelativePath(srcPath, file));
zipEntry.setSize(file.length());
zipEntry.setTime(file.lastModified());
zipOutputStream.putNextEntry(zipEntry);
InputStream inputStream = new BufferedInputStream(new FileInputStream(file));
while ((readLength = inputStream.read(buffer, 0, BUFFER)) != -1) {
zipOutputStream.write(buffer, 0, readLength);
}
inputStream.close();
} else {
zipEntry = new ZipEntry(getRelativePath(srcPath, file) + "/");
zipOutputStream.putNextEntry(zipEntry);
}
}
} catch (FileNotFoundException e) {
e.printStackTrace();
return -1;
} catch (IOException e) {
e.printStackTrace();
return -2;
} finally {
try {
if (zipOutputStream != null)
zipOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
return -2;
}
}
return count;
}
/**
* get file list from srcFile
* @param srcFile 文件路径
* @return 对文件路径下的所有文件集合
*/
private static List<File> getAllFiles(File srcFile) {
List<File> fileList = new ArrayList<File>();
File[] tmp = srcFile.listFiles();
for (int i = 0; i < tmp.length; i++) {
if (tmp[i].isFile()) {
fileList.add(tmp[i]);
}
if (tmp[i].isDirectory()) {
// 若不是空目录,则递归添加其下的目录和文件
if (tmp[i].listFiles().length != 0) {
fileList.addAll(getAllFiles(tmp[i]));
}
// 若是空目录,则添加这个目录到fileList
else {
fileList.add(tmp[i]);
}
}
}
return fileList;
}
private static String getRelativePath(String dirPath, File file) {
File dir = new File(dirPath);
String relativePath = file.getName();
while (true) {
file = file.getParentFile();
if (file == null) {
break;
}
if (file.equals(dir)) {
break;
} else {
relativePath = file.getName() + "/" + relativePath;
}
}
return relativePath;
}
private static File createFile(String srcPath, String fileName){
// 将文件名的各级目录分解
String[] dirs = fileName.split("/");
File file = new File(srcPath);
// 文件有上级目录
if (dirs.length > 1) {
for (int i = 0; i < dirs.length - 1; i++) {
// 依次创建文件对象知道文件的上一级目录
file = new File(file, dirs[i]);
}
if (!file.exists()) {
// 文件对应目录若不存在,则创建
file.mkdirs();
}
// 创建文件
file = new File(file, dirs[dirs.length - 1]);
return file;
} else {
if (!file.exists()) {
// 若目标路径的目录不存在,则创建
file.mkdirs();
}
// 创建文件
file = new File(file, dirs[0]);
return file;
}
}
}