Java壓縮zip檔案(怎樣用Java將檔案追加到zip檔案)
學習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 * @版權:[email protected] 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
* @版權: [email protected] 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();
}
}
}
相關推薦
java指定編碼的按行讀寫txt檔案(幾種讀寫方式的比較)
輸入輸出的幾種形式 1.FileReader,FileWriter File r = new File("temp.txt") FileReader f = new FileReader(name);//讀取檔案name BufferedReader b = new Buf
Java面向物件——類與方法(練習:將車抽象為類)
程式碼: public class Car{ //屬性 //品牌(不可更改)、產地(不可更改)、顏色、價格 private String brand; private String origin; private String colour; private int price;
資料結構學習筆記Day2-單鏈表(用java實現)
一、首先說一下線性表 1. 什麼是線性表,線性表的邏輯特性? 1)有一個頭(表頭),有一個尾(表尾) 2)表頭與表尾之間的元素有且只有一個前驅元素,有且只有一個後繼元素 2.線性表有兩種儲存方式? 順序表和連結串列 3.順序表和連結串列的區別? 1)順序表是一邊
用例子理解Java許可權修飾符(private,default,protected和public)
許可權修飾用於限定物件起作用的範圍,也就是,在什麼地方我們能夠訪問到這個物件,在什麼地方我們訪問不到這個物件了,這裡的物件是指屬性、方法、類和介面。 一、許可權修飾符作用於屬性和方法。private,
c語言將資料寫入檔案(用連結串列實現)
/*c語言將資料寫入檔案,用連結串列實現*/ #include #include #include /*定義結構體*/ typedef struct Node { char id[10];
java 10 生成標頭檔案(javah不是內部或外部命令)(java呼叫c)
在用java呼叫c的過程中,需要對java檔案生成對應的.h標頭檔案。 網上一些教程使用的方法(javah -jni 目標檔案)已經過時,這是因為java10已經移除了javah的相關功能。 為了使用java 10生成標頭檔案,在windows的cmd命令列中使用以下命令
去掉java中的註釋(尤其針對反編譯後的檔案)
package day20151217; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.FileInputSt
java按比例壓縮圖片的原始碼,用java如何把圖片處理到指定大小
public static void uploadImage(File p_in,File p_out,int height,int width,String ftype) throws FileNotFoundException,IOException {// 取得圖片處理// Conver
JAVA的單例模式(用java寫一個singleton的例子)。
程式碼如下: package test; public class SingleObject {// 建立 SingleObject 的一個物件private static SingleObject
java 檔案加密 用的是md5值進行檔案加密
加密解密的背景, 原理和用法在程式碼註釋裡 程式碼: import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.security.Mes
java native interface JNI 調用Java方法
程序 color void size nature llb 方法調用 margin 處理 在上一篇文章中介紹了JNI。以及java調用JNI。這篇講一下 JNI調用java方法。 通過使用合適的JNI函數,你能夠創建Java對象,get、set 靜態(s
java編碼轉換過程(轉自http://cmsblogs.com/?p=1475)
tex src bytes .com 設定 界面 console 獲取 java程序 一、java編碼轉換過程(轉自http://cmsblogs.com/?p=1475) 我們總是用一個java類文件和用戶進行最直接的交互(輸入、輸出),這些交互內容包含的文字可能會包含
hbase java api樣例(版本1.3.1,新API)
quorum desc color -i arraylist byte logs sin fig 驗證了如下幾種java api的使用方法。 1.創建表 2.創建表(預分區) 3.單條插入 4.批量插入 5.批量插入(寫緩存) 6.單條get 7.批量get 8.簡單sca
Java學習筆記16(面向對象九:補充內容)
nal ati 接收 pri version prot sys add [] 總是看到四種權限,這裏做一個介紹: 最大權限是public,後面依次是protected,default,private private修飾的只在本類可以使用 public是最大權限,可以跨包使用
Java學習筆記30(集合框架四:List接口)
package int 集合框架 初始 tro color arraylist 原理 void List接口繼承自Collection接口 具有重要的三大特點: 1.有序集合:存入和取出的順序一致 2.此接口的用戶可以對列表中每個元素插入位置精確的控制:可以通過索引操作 3
Java學習筆記32(集合框架六:Map接口)
hashtable code rri 輸出 clas bsp pan ons spa Map接口與Collection不同: Collection中的集合元素是孤立的,可理解為單身,是一個一個存進去的,稱為單列集合 Map中的集合元素是成對存在的,可理解為夫妻,是一對一對存
Java數據結構(線性表-->順序表簡單實現)
str out ret rgs sem emp 效果 tab 廣泛 線性表是一種可以在任意位置插入和刪除元素,由n個同類型元素組成的線性結構。主要包括順序表,單鏈表,循環單鏈表,雙向鏈表和仿真鏈表。應用比較廣泛的是順序表和單鏈表。 2 下面是線性表的接口,主要操作包括
新手小白Linux(Centos6.5)部署java web項目(mongodb4.0.2安裝及相關操作)
read har space 創建 縮進 路徑 .org font url 紅帽企業或CentOS的Linux上安裝MongoDB的社區版: https://docs.mongodb.com/manual/tutorial/install-mongodb-on-red-ha
vue問題之被複用的vue檔案(用vue-echarts實現),資料有快取
一、問題 當多個路由複用同一個模板,此時在這幾個路由間切換,被複用的模板有資料快取問題。 如一個路由頁面出現的圖表有5個柱狀圖,在另一個路由頁面出現的圖表是7個柱狀圖,且資料項都不同, 問題:在另一個路由頁面會先出現第一個路由頁面的5個柱狀圖,再載入應有的7個柱狀圖 二、解決方法
Java 009 面向物件(多型、抽象類、介面)
知識點梳理 心得體會 小知識點 1.多型中成員訪問特點:成員方法看左右,子類都會先訪問父類構造方法(先初始化父類成員才能被子類呼叫),其他只看左邊 2.多型缺點:不能使用子類特有功能,解決辦法有兩種:一、建立子類物件調方法(不合理且佔記憶體)二、向下轉型:Zi z=(Zi)