使用jar:
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.6</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-compress</artifactId>
<version>1.20</version>
</dependency>
待优化:
1、放到工程中需要把缓存目录写一下
2、压缩前应清楚缓存目录
亮点:
1、使用Try-with-resources
2、文件多重压缩
源代码:
import org.apache.commons.compress.archivers.ArchiveOutputStream;
import org.apache.commons.compress.archivers.ArchiveStreamFactory;
import org.apache.commons.compress.archivers.zip.ZipArchiveEntry;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOUtils;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.Iterator;
/**
* @program: youfang
* @Date: 2020/4/9 15:59
* @Author: yangjl
* @Description:
*/
public class FileCompression {
public static void main(String[] args) {
//1 将word文件打包
// FileCompression.zip("D:\\abd\\abd.zip", "D:\\abc", new String[]{"docx"});
FileCompression.everyZip("D:\\abd","D:\\abc",new String[]{"docx"});
//删除目录下所有文件,请自行编写,太危险,调用delete()方法
//2 将打包后的文件打包
FileCompression.zip("D:\\abe\\abe.zip","D:\\abd",new String[]{"zip"});
}
/**
* 指定目录下所有文件压缩
*
* @param zipPath 压缩文件路径和名称
* @param fileDir 待压缩的目录
* @date 2020/4/10 8:48
*/
public static void zip(String zipPath, String fileDir, String[] suffix) {
File outFile =new File(zipPath);
try (FileOutputStream fileOutputStream =new FileOutputStream(outFile);
BufferedOutputStream bufferedOutputStream =new BufferedOutputStream(fileOutputStream);
ArchiveOutputStream outputStream =new ArchiveStreamFactory()
.createArchiveOutputStream(ArchiveStreamFactory.ZIP, bufferedOutputStream)) {
outFile.createNewFile();
Iterator files = FileUtils.iterateFiles(new File(fileDir), suffix,true);
File file;
while (files.hasNext()) {
file = files.next();
outputStream.putArchiveEntry(new ZipArchiveEntry(file, file.getName()));
IOUtils.copy(new FileInputStream(file), outputStream);
outputStream.closeArchiveEntry();
}
outputStream.finish();
}catch (Exception e) {
e.printStackTrace();
}
}
/**
* 每一个文件进行压缩
*
* @param zipDir zip压缩目录
* @param fileDir 文件目录
* @return
* @date 2020/4/10 8:55
*/
public static void everyZip(String zipDir, String fileDir, String[] suffix) {
Iterator files = FileUtils.iterateFiles(new File(fileDir), suffix,true);
File outFile;
File file;
String fileName;
while (files.hasNext()) {
if (!zipDir.endsWith(File.separator)) {
zipDir += File.separator;
}
file = files.next();
fileName = file.getName();
outFile =new File(zipDir + fileName.substring(0, fileName.indexOf(".")) +".zip");
try (FileOutputStream fileOutputStream =new FileOutputStream(outFile);
BufferedOutputStream bufferedOutputStream =new BufferedOutputStream(fileOutputStream);
ArchiveOutputStream outputStream =new ArchiveStreamFactory()
.createArchiveOutputStream(ArchiveStreamFactory.ZIP, bufferedOutputStream)) {
outFile.createNewFile();
outputStream.putArchiveEntry(new ZipArchiveEntry(file, file.getName()));
IOUtils.copy(new FileInputStream(file), outputStream);
outputStream.closeArchiveEntry();
outputStream.finish();
}catch (Exception e) {
e.printStackTrace();
}
}
}
}