学习Java压缩zip文件:
压缩单个文件和多个文件,不包含文件夹;
怎样用Java将文件追加到zip文件中。
测试类:
/**
* @FileName:ZipTest.java
* @Description: TODO
* @Copyright: All rights Reserved, Designed By [meter] Copyright(C) 2010-2018
* @Company:
* @author:meter
* @version: V1.0
* @Create:2018年5月4日 上午9:50:22
*
* Modification History:
* Date Author Version Discription
* -----------------------------------------------------------------------------------
* 2018年5月4日 meter 1.0 1.0
* Why & What is modified: <修改原因描述>
*/
package org.meter.demo;
import java.io.File;
import java.io.FileFilter;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Scanner;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import org.meter.zip.ZipTools;
/**
* @项目名称:meter
* @类名称:ZipTest
* @类描述:
* @创建人:meter
* @创建时间:2018年5月4日 上午9:50:22
* @版权:Copyright@2018.All Rights Reserved
* @version v1.0
*/
public class ZipTest {
private static SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddhhmmssSSSS");
private static ThreadPoolExecutor workerPool=new ThreadPoolExecutor(20,
25,
1,
TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>(15),
new ThreadPoolExecutor.CallerRunsPolicy());
private static void test(String path,Long size) throws Exception{
workerPool.allowCoreThreadTimeOut(true);// 设置超时时关闭线程
File dir=new File(path);
if(!dir.exists()){
System.out.println("当前路径:"+path+"不存在");
return;
}
System.out.println("当前路径:"+dir.getAbsolutePath());
File[] files =dir.listFiles(new FileFilter(){
@Override
public boolean accept(File pathname) {
if(pathname.getName().toLowerCase().endsWith(".zip")&&pathname.getName().toLowerCase().contains("sca_2018")){
return true;
}
return false;
}
});
long fileSize=0;
List<File> fileList=new ArrayList<File>();
String zipName="sca_"+sdf.format(new Date())+".zip";
int flag=files.length;
for(File file:files){
System.out.println("读取到文件:"+file.getName());
fileSize+=file.length();
fileList.add(file);
flag--;
if(fileSize>=size){
workerPool.execute(new InnerWorker(fileList,zipName));
fileSize=0;
fileList=new ArrayList<File>();
zipName="sca_"+sdf.format(new Date())+".zip";
} else if(flag<=0){
ZipTools.zipFiles(fileList,new File(zipName));
}
}
}
private static class InnerWorker implements Runnable{
private List<File> fileList;
private String zipName;
public InnerWorker(List<File> fileList,String zipName){
this.fileList=fileList;
this.zipName=zipName;
}
@Override
public void run() {
try {
ZipTools.zipFiles(fileList,new File(zipName));
System.out.println("压缩文件["+zipName+"]成功。");
} catch (Exception e) {
e.printStackTrace();
System.out.println("压缩失败文件:"+zipName);
}
}
}
/** @创建日期:2018年5月4日 上午9:50:22
* @作者: meter
* @描述:TODO
* @Title: main
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
System.out.println("Please input the path:");
Scanner input = new Scanner(System.in);
String path=input.nextLine();
test(path,2147483648L);
}
}
工具类:
/**
* @FileName:ZipTools.java
* @Description: TODO
* @Copyright: All rights Reserved, Designed By [meter] Copyright(C) 2010-2018
* @Company: 米特娱乐乐园
* @author:meter
* @version: V1.0
* @Create:2018年5月4日 上午10:25:09
*
* Modification History:
* Date Author Version Discription
* -----------------------------------------------------------------------------------
* 2018年5月4日 meter 1.0 1.0
* Why & What is modified: <修改原因描述>
*/
package org.meter.zip;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.charset.Charset;
import java.util.Enumeration;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import java.util.zip.ZipOutputStream;
/**
* @项目名称:meter
* @类名称:ZipTools
* @类描述:采用zip压缩文件
* @创建人:meter
* @创建时间:2018年5月4日 上午10:25:09
* @版权:Copyright@2018.All Rights Reserved
* @version v1.0
*/
public class ZipTools {
/**
* @创建日期:2018年5月4日 下午1:37:22
* @作者: meter
* @描述:压缩多个文件的情况
* @Title: zip
* @param fileList
* @param zipFile
* @throws Exception
*/
public static void zipFiles(List<File> fileList,File zipFile) throws Exception{
System.out.println("zipFiles待压缩文件:"+zipFile.getAbsolutePath());
if(fileList != null){
if(zipFile.exists()){//压缩文件已经存在,则只能单个添加
for(File file:fileList){
zip(zipFile,file);
}
}else{//不存在则新建
// 创建zip输出流
ZipOutputStream zipOutStream = new ZipOutputStream(new FileOutputStream(zipFile), Charset.forName("UTF-8"));
// 创建缓冲输出流
BufferedOutputStream bufferOutStream = new BufferedOutputStream(zipOutStream);
for(File file:fileList){
zipFile(file,zipOutStream,bufferOutStream);
}
//最后关闭输出流
bufferOutStream.close();
zipOutStream.close();
}
}
}
/**
* @创建日期:2018年5月4日 下午1:44:55
* @作者: meter
* @描述:执行文件压缩
* @Title: zipFile
* @param file
* @param zipOutStream
* @param bufferOutStream
* @throws IOException
*/
private static void zipFile(File file,ZipOutputStream zipOutStream,BufferedOutputStream bufferOutStream) throws IOException{
// 创建压缩文件实体
ZipEntry entry = new ZipEntry(file.getName());
// 添加实体
zipOutStream.putNextEntry(entry);
// 创建输入流
BufferedInputStream bufferInputStream = new BufferedInputStream(new FileInputStream(file));
write(bufferInputStream, bufferOutStream);
zipOutStream.closeEntry();
}
/**
* @创建日期:2018年5月4日 下午1:37:01
* @作者: meter
* @描述:压缩单个文件
* @Title: zip
* @param zipFile
* @param sourceFile
* @throws Exception
*/
public static void zip(File zipFile, File sourceFile) throws Exception {
System.out.println("待压缩文件:"+zipFile.getAbsolutePath());
if (zipFile.exists()) {// 添加到已经存在的压缩文件中
File tempFile=new File(zipFile.getAbsolutePath()+".tmp");
// 创建zip输出流
ZipOutputStream zipOutStream = new ZipOutputStream(new FileOutputStream(tempFile), Charset.forName("UTF-8"));
// 创建缓冲输出流
BufferedOutputStream bufferOutStream = new BufferedOutputStream(zipOutStream);
ZipFile zipOutFile = new ZipFile(zipFile);
Enumeration<? extends ZipEntry> entries = zipOutFile.entries();
while (entries.hasMoreElements()) {
ZipEntry entry = entries.nextElement();
System.out.println("copy: " + entry.getName());
zipOutStream.putNextEntry(entry);
if (!entry.isDirectory()) {
write(zipOutFile.getInputStream(entry), bufferOutStream);
}
zipOutStream.closeEntry();
}
zipOutFile.close();//记得关闭zip文件,否则后面无法删除原始文件
ZipEntry entry = new ZipEntry(sourceFile.getName());
// 添加实体
zipOutStream.putNextEntry(entry);
BufferedInputStream bufferInputStream = new BufferedInputStream(new FileInputStream(sourceFile));
write(bufferInputStream, bufferOutStream);
//最后关闭输出流
bufferOutStream.close();
zipOutStream.close();
boolean flag=zipFile.delete();
if(flag){
tempFile.renameTo(zipFile);
}else{
System.out.println("删除文件失败。");
}
} else {// 新创建压缩文件
// 创建zip输出流
ZipOutputStream zipOutStream = new ZipOutputStream(new FileOutputStream(zipFile), Charset.forName("UTF-8"));
// 创建缓冲输出流
BufferedOutputStream bufferOutStream = new BufferedOutputStream(zipOutStream);
// 创建压缩文件实体
ZipEntry entry = new ZipEntry(sourceFile.getName());
// 添加实体
zipOutStream.putNextEntry(entry);
// 创建输入流
BufferedInputStream bufferInputStream = new BufferedInputStream(new FileInputStream(sourceFile));
write(bufferInputStream, bufferOutStream);
//最后关闭输出流
bufferOutStream.close();
zipOutStream.close();
}
}
/**
* @创建日期:2018年5月4日 下午2:09:37
* @作者: meter
* @描述:读写zip文件
* @Title: write
* @param inputStream
* @param outStream
* @throws IOException
*/
private static void write(InputStream inputStream,OutputStream outStream) throws IOException{
byte[] data=new byte[4096];
int length=0;
while((length=inputStream.read(data)) != -1){
outStream.write(data,0,length);
}
outStream.flush();//刷新输出流
inputStream.close();//关闭输入流
}
/**
* @创建日期:2018年5月4日 下午3:07:55
* @作者: meter
* @描述:压缩指定目录下所有文件
* @Title: zipDirectory
* @param dirFile
* @param zipFile
* @throws IOException
*/
public static void zipDirectory(File dirFile,File zipFile) throws IOException{
if(dirFile != null && dirFile.isDirectory()){
if(zipFile == null){
zipFile=new File(dirFile.getAbsolutePath()+".zip");
}
String dirName=dirFile.getName()+File.separator;
// 创建zip输出流
ZipOutputStream zipOutStream = new ZipOutputStream(new FileOutputStream(zipFile), Charset.forName("UTF-8"));
// 创建缓冲输出流
BufferedOutputStream bufferOutStream = new BufferedOutputStream(zipOutStream);
dealDirFile( dirFile,dirName,bufferOutStream,zipOutStream);
//最后关闭输出流
bufferOutStream.close();
zipOutStream.close();
}else{
System.out.println("["+dirFile.getName()+"]不是一个文件夹,或者不存在。");
}
}
/**
* @创建日期:2018年5月4日 下午4:38:46
* @作者: meter
* @描述:处理目录文件
* @Title: dealDirFile
* @param dirFile
* @param parentDir
* @param bufferOutStream
* @param zipOutStream
* @throws IOException
*/
private static void dealDirFile(File dirFile,String parentDir, BufferedOutputStream bufferOutStream, ZipOutputStream zipOutStream) throws IOException{
File[] fileList=dirFile.listFiles();
for(File file:fileList){
if(file.isFile()){
// 创建压缩文件实体
ZipEntry entry = new ZipEntry(parentDir+file.getName());
// 添加实体
zipOutStream.putNextEntry(entry);
// 创建输入流
BufferedInputStream bufferInputStream = new BufferedInputStream(new FileInputStream(file));
write(bufferInputStream, bufferOutStream);
}else{
dealDirFile(file, parentDir+file.getName()+File.separator, bufferOutStream, zipOutStream);
}
}
}
/**
* @创建日期:2018年5月4日 下午3:22:11
* @作者: meter
* @描述:重载zipDirectory
* @Title: zipDirectory
* @param dirPath
* @param zipPath
* @throws IOException
*/
public static void zipDirectory(String dirPath,String zipPath) throws IOException{
if(zipPath==null || "".equals(zipPath)){
zipDirectory(new File(dirPath),null);
}else{
zipDirectory(new File(dirPath),new File(zipPath));
}
}
//------------------------------------------------米特华丽的分割线----------------------------------------------------------------------------------------
/**
* @创建日期:2018年5月4日 下午4:00:41
* @作者: meter
* @描述:解压文件
* @Title: unzip
* @param zipFile
* @param destDir
* @throws IOException
*/
public static void unzip(File zipFile, File destDir) throws IOException {
ZipFile zipOutFile = new ZipFile(zipFile,Charset.forName("gbk"));
Enumeration<? extends ZipEntry> entries = zipOutFile.entries();
while (entries.hasMoreElements()) {
ZipEntry entry = entries.nextElement();
if(entry.isDirectory()){
File tempFile = new File(destDir.getAbsolutePath()+File.separator+entry.getName());
if (!tempFile.exists()) {
tempFile.mkdirs();
}
}else{
File tempFile=new File(destDir.getAbsolutePath()+File.separator+entry.getName());
checkParentDir(tempFile);
FileOutputStream fileOutStream=new FileOutputStream(tempFile);
BufferedOutputStream bufferOutStream = new BufferedOutputStream(fileOutStream);
write(zipOutFile.getInputStream(entry),bufferOutStream);
bufferOutStream.close();
fileOutStream.close();
}
}
zipOutFile.close();//记得关闭zip文件
}
/**
* @创建日期:2018年5月4日 下午4:37:41
* @作者: meter
* @描述:验证父目录是否存在,否则创建
* @Title: checkParentDir
* @param file
*/
private static void checkParentDir(File file){
if(!file.getParentFile().exists()){
file.getParentFile().mkdirs();
}
}
}