使用java.util.zip
相关类,将给定文件或文件夹压缩到指定zip
- 使用
ZipOutputStream
对象构建zip包存放位置,将要添加的文件构建为ZipEntry
对象, - 调用
ZipOutputStream.putNextEntry(ZipEntry zipEntry)
用来标记压缩包中一个文件的开始, - 调用
ZipOutput.write(byte[] b, int off, int len)
将文件写入到压缩包的流之中(该方法会阻塞,直到将此文件全部写入,byte[]可以直接获取也可以使用缓冲流。写入时会自动压缩)。 - 注意
ZipOutputStream
添加完文件后必须使用ZipOutputStream.closeEntry()
和ZipOutputStream.close()
关闭流。
示例代码如下
package com.zip;
import java.io.*;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
/**
* @author zy
* @version V1.0
* @date 2022/8/11 11:14
*/
public class ZipTest {
public static void main(String[] args) throws IOException {
test01();
}
static void test01() throws IOException {
String compresspath = "D:\\暂存文件";
ZipOutputStream zipOutputStream = new ZipOutputStream(new FileOutputStream(compresspath+".zip"));
File file = new File(compresspath);
compressZip(zipOutputStream, file, "");
//必须关闭,否则压缩后的zip包有问题,不能解压
zipOutputStream.closeEntry();
zipOutputStream.close();
}
private static void compressZip(ZipOutputStream zipOutput, File file, String suffixpath) {
File[] listFiles = file.listFiles();// 列出所有的文件
for(File fi : listFiles){
if(fi.isDirectory()){
if(suffixpath.equals("")){
compressZip(zipOutput, fi, fi.getName());
}else{
compressZip(zipOutput, fi, suffixpath + File.separator + fi.getName());
}
}else{
zip(zipOutput, fi, suffixpath);
}
}
}
public static void zip(ZipOutputStream zipOutput, File file, String suffixpath) {
try {
ZipEntry zEntry = null;
if(suffixpath.equals("")){
zEntry = new ZipEntry(file.getName());
}else{
zEntry = new ZipEntry(suffixpath + File.separator + file.getName());
}
//核心代码
zipOutput.putNextEntry(zEntry);
//将给定文件写入到压缩包中
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));
byte[] buffer = new byte[1024];
int read = 0;
while((read = bis.read(buffer)) != -1){
//会自动压缩流数据
zipOutput.write(buffer, 0, read);
}
bis.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
欢迎留言讨论