1.ZipOutputStream
首先需要简单的了解一下API,ZipOutStream中是以ZipEntry为一个文件或者一个目录的。这里只讲使用方法。
import java.util.zip.ZipEntry;
import java.util.zip.ZipIntputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
import java.io.BufferedInputStream;
import java.util.ArrayList;
import java.util.List;
class ZipUtil{
/****
* 可以传入文件夹和文件
* TODO 这里省去了参数非空验证,文件是否存在的操作
* 复制直接使用请自行加入验证
* filePath 文件夹或文件名
* zipPath 压缩文件绝对路径
* isSrc 是否保持原来的目录结构
*/
public static void fileToZip(String filePath,String zipPath,boolean isSrc){
//1.根据参数来判断入参是文件还是文件夹
File root = new File(filePath);
List<File> files = new ArrayList<>();
if (root.isDirectory()){
//遍历文件
files.addAll(allFile(filePath));
}else{
//直接写入
files.add(root);
}
try (
FileOutputStream fileOutputStream = new FileOutputStream(zipPath);
ZipOutputStream zipOutputStream = new ZipOutputStream(fileOutputStream)
) {
ZipEntry fileEntry = null;
for (int i = 0; i < files.size(); i++) {
File file = files.get(i);
if (isSrc) {
fileEntry = new ZipEntry(file.getAbsolutePath());
} else {
//会存在重名的问题
//创建ZipEntry中的参数就是压缩包中文件名称
fileEntry = new ZipEntry(i + "_" + file.getName());
}
zipOutputStream.putNextEntry(fileEntry);
int len = -1;
FileInputStream inputStream = new FileInputStream(file);
BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream);
byte[] buffer = new byte[8096];
while ((len = bufferedInputStream.read(buffer)) > 0) {
zipOutputStream.write(buffer, 0, len);
}
bufferedInputStream.close();
inputStream.close();
zipOutputStream.closeEntry();
}
} catch (IOException e) {
e.printStackTrace();
}
}
//获取目录下的所有文件
private static List<File> allFile(String filePath) {
List<File> files = new ArrayList<>();
File root = new File(filePath);
if (root.exists()) {
if (root.isDirectory()) {
File[] listFiles = root.listFiles();
for (File file : listFiles) {
if (file.isDirectory()) {
files.addAll(allFile(file.getAbsolutePath()));
} else {
files.add(file);
}
}
} else {
files.add(root);
}
}
return files;
}
}
详细操作以及代码注释都已经写在源码中,请自行看注释。
2.ZipInputStream
/****
* 解压
* @param filePath 需要解压的文件
* @param unZipPath 解压完放置文件的位置
*/
public void unZipToFile(String filePath,String unZipPath){
try (
InputStream inputStream = new FileInputStream(filePath);
ZipInputStream zipInputStream = new ZipInputStream(inputStream)
) {
ZipEntry zipEntry = null;
while ((zipEntry = zipInputStream.getNextEntry()) != null) {
File zipFile = new File(unZipPath, zipEntry.getName());
if (zipEntry.isDirectory()) {
zipFile.mkdirs();
} else {
zipFile.getParentFile().mkdirs();
System.out.println(zipEntry.getName());
FileOutputStream fileOutputStream = new FileOutputStream(zipFile);
int len = -1;
byte[] bytes = new byte[8096];
while ((len = zipInputStream.read(bytes)) > 0) {
fileOutputStream.write(bytes, 0, len);
}
fileOutputStream.close();
}
zipInputStream.closeEntry();
}
} catch (IOException e) {
e.printStackTrace();
}
}