部分代码引用:【Java代码优化】Zip压缩大文件从30秒到近乎1秒的优化过程(提供源码)_Joker_Ye的博客-CSDN博客
在原来代码上增加hutool ziputil的压缩代码
package com.example.zipdemo;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.ZipUtil;
import java.io.*;
import java.nio.MappedByteBuffer;
import java.nio.channels.Channels;
import java.nio.channels.FileChannel;
import java.nio.channels.WritableByteChannel;
import java.util.ArrayList;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
public class ZipTest {
private static String ZIP_FILE="D:/Download/test.zip";
private static String JPG_FILE_PATH="C:\\Users\\gaga\\Downloads\\pic\\";
private static String JPG_FILE_NAME="img";
static int max_num = 573;
public static void zipFileNoBuffer() {
File zipFile = new File(ZIP_FILE);
try (ZipOutputStream zipOut = new ZipOutputStream(new FileOutputStream(zipFile))) {
//开始时间
long beginTime = System.currentTimeMillis();
for (int i = 1; i <= max_num; i++) {
try (InputStream input = new FileInputStream(JPG_FILE_PATH +"img"+" ("+ i + ").jpg")) {
zipOut.putNextEntry(new ZipEntry(JPG_FILE_NAME + i + ".jpg"));
int temp = 0;
while ((temp = input.read()) != -1) {
zipOut.write(temp);
}
}
}
printInfo(beginTime);
} catch (Exception e) {
e.printStackTrace();
}
}
public static void zipFileBuffer() {
//开始时间
long beginTime = System.currentTimeMillis();
File zipFile = new File(ZIP_FILE);
try (ZipOutputStream zipOut = new ZipOutputStream(new FileOutputStream(zipFile));
BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(zipOut)) {
for (int i = 1; i <= max_num; i++) {
try (BufferedInputStream bufferedInputStream = new BufferedInputStream(new FileInputStream(JPG_FILE_PATH +"img"+" ("+ i + ").jpg"))) {
zipOut.putNextEntry(new ZipEntry(JPG_FILE_NAME + i + ".jpg"));
int temp = 0;
while ((temp = bufferedInputStream.read()) != -1) {
bufferedOutputStream.write(temp);
}
}
}
printInfo(beginTime);
} catch (Exception e) {
e.printStackTrace();
}
}
public static void zipFileChannel() {
//开始时间
long beginTime = System.currentTimeMillis();
File zipFile = new File(ZIP_FILE);
try (ZipOutputStream zipOut = new ZipOutputStream(new FileOutputStream(zipFile));
WritableByteChannel writableByteChannel = Channels.newChannel(zipOut)) {
for (int i = 1; i <= max_num; i++) {
try (FileChannel fileChannel = new FileInputStream(JPG_FILE_PATH +"img"+" ("+ i + ").jpg").getChannel()) {
zipOut.putNextEntry(new ZipEntry(JPG_FILE_NAME + i + ".jpg"));
fileChannel.transferTo(0, fileChannel.size(), writableByteChannel);
System.out.println("size:"+fileChannel.size());
}
}
printInfo(beginTime);
} catch (Exception e) {
e.printStackTrace();
}
}
public static void zipFileMap() {
//开始时间
long beginTime = System.currentTimeMillis();
File zipFile = new File(ZIP_FILE);
try (ZipOutputStream zipOut = new ZipOutputStream(new FileOutputStream(zipFile));
WritableByteChannel writableByteChannel = Channels.newChannel(zipOut)) {
for (int i = 1; i <= max_num; i++) {
zipOut.putNextEntry(new ZipEntry(JPG_FILE_NAME + i + ".jpg"));
//内存中的映射文件
RandomAccessFile raFile=new RandomAccessFile(JPG_FILE_PATH + "img"+" ("+ i + ").jpg", "r");
MappedByteBuffer mappedByteBuffer = raFile.getChannel()
.map(FileChannel.MapMode.READ_ONLY, 0, raFile.length());
//System.out.println(raFile.length());
writableByteChannel.write(mappedByteBuffer);
}
printInfo(beginTime);
} catch (Exception e) {
e.printStackTrace();
}
}
public static void zipCopyFileByHutool() {
long beginTime = System.currentTimeMillis();
String dirPath = "D:/Download/test";
for (int i = 1; i <= max_num; i++) {
String data= (JPG_FILE_PATH +"img"+" ("+ i + ").jpg");
String fnn= (dirPath +"/" +"img"+ i + ".jpg");
FileUtil.mkParentDirs(fnn);
if (!FileUtil.exist(fnn)) {
FileUtil.copyFile(data, fnn);
}
}
zip(dirPath);
printInfo(beginTime);
}
public static void zipFileByHutool() {
long beginTime = System.currentTimeMillis();
File zipFile = new File(ZIP_FILE);
String dirPath = "D:/Download/test";
List<File> files = new ArrayList<File>();
for (int i = 1; i <= max_num; i++) {
String data= (JPG_FILE_PATH +"img"+" ("+ i + ").jpg");
files.add(new File(data));
}
zip(zipFile,files);
printInfo(beginTime);
}
private static File zip(File zip, List<File> fileList) {
// 压缩到的位置
File zipFile = null;
try {
// 压缩多个文件,压缩后会将压缩临时文件删除
zipFile = ZipUtil.zip(zip,false, fileList.toArray(new File[fileList.size()]));
} catch (Exception e) {
System.out.println("文件压缩异常"+ e.getMessage());
}
return zipFile;
}
public static File zip(String dirPath) {
// 压缩到的位置
File zipFile = null;
try {
// 压缩多个文件,压缩后会将压缩临时文件删除
zipFile = ZipUtil.zip(dirPath);
} catch (Exception e) {
System.out.println("文件压缩异常"+ e.getMessage());
}
return zipFile;
}
public static void printInfo(long beginTime) {
long endTime= System.currentTimeMillis();
long total=endTime-beginTime;
System.out.println(""+total);
System.out.println("耗時:"+total/ 1000 % 60 );
}
public static void main(String[] args) {
// zipFileNoBuffer();
// zipFileBuffer();
// zipFileMap();
zipCopyFileByHutool();
// zipFileByHutool();
}
}