文件压缩 测试1.55G压缩时间为2分钟
package zip;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.time.LocalDateTime;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
public class CompressFile {
public static void compressAllZip(String dirPath,String targetName){
if(dirPath == null){ // 判断目录是否存在
System.err.println("压缩失败"+dirPath+"目录不存在");
return;
}
File baseDir = new File(dirPath); //判断dirPath 是不是目录
if(!baseDir.exists() || !baseDir.isDirectory()){
System.err.println("压缩失败"+dirPath+"目录不存在");
return;
}
String basicRootDir = baseDir.getAbsolutePath();
try {
//创建一个zip输出流来压缩数据并写入ZIP文件
ZipOutputStream out = new ZipOutputStream(new FileOutputStream(targetName));
compressDirToZip(basicRootDir,baseDir,out);
out.close();
System.out.println("文件压缩成功,压缩包的文件名为: " + targetName);
} catch (IOException e) {
System.err.println("压缩失败:"+e);
e.printStackTrace();
}
}
//利用ZipOutputStream对目录进行压缩
private static void compressDirToZip(String basicRootDir,File dir,ZipOutputStream out){
if(dir.isDirectory()){
File[] files = dir.listFiles();// 列出dir目录下的所有文件
if(files.length==0){//如果是空文件夹
//存储目录信息
ZipEntry entry = new ZipEntry(getFileName(basicRootDir,dir));
try {
out.putNextEntry(entry);
out.closeEntry();
} catch (IOException e) {
e.printStackTrace();
}
return;
}
for (int i = 0; i < files.length; i++) {
if(files[i].isFile()){
//如果是文件,则调用compressFileToZip()方法
CompressFile.compressFileToZip(basicRootDir, files[i], out);
}else{
//如果是目录,则递归调用
CompressFile.compressDirToZip(basicRootDir, files[i], out);
}
}
}
}
//利用 ZipOutputStream对文件进行压缩
private static void compressFileToZip(String basicRootDir,File file,ZipOutputStream out){
FileInputStream in = null;
ZipEntry entry = null;
byte[] buffer = new byte[4096]; //创建复制缓冲区
int bytes_read;
if(file.isFile()){
try {
in = new FileInputStream(file); //创建一个文件输入流
//根据压缩文件的名字构造一个ZipEntry对象,此类标识ZIP包中的文件条目
entry = new ZipEntry(getFileName(basicRootDir, file));
out.putNextEntry(entry);//存储项信息到压缩文件
//将文件的内容通过字节数组复制到压缩文件中
while((bytes_read = in.read(buffer)) != -1){
out.write(buffer,0,bytes_read);
}
out.closeEntry();
in.close();
System.out.println("添加文件"+file.getAbsolutePath() + "到ZIP文件中!");
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
//获取等待压缩的文件的文件名
private static String getFileName(String basicRootDir,File file){
if(!basicRootDir.endsWith(File.separator)){
basicRootDir += File.separator;
}
String filePath = file.getAbsolutePath();
//对于目录,必须在entry名字后面加上“/”,标识他将以目录项存储
if(file.isDirectory()){
filePath += "/";
}
int index = filePath.indexOf(basicRootDir);
return filePath.substring(index + basicRootDir.length());
}
public static void main(String[] args) {
String dir = "D:/MyDownloads";//压缩目录
String targetName = "D:/MyDownloads.zip";//压缩后ZIP文件
System.out.println("开始压缩时间:"+LocalDateTime.now());
long start = System.currentTimeMillis();
compressAllZip(dir,targetName);
long end = System.currentTimeMillis();
System.out.println("结束压缩时间:"+LocalDateTime.now());
System.out.println("压缩时长:"+(end-start)/1000/60 + "分钟");
}
}