1. 程式人生 > >Java壓縮zip檔案(怎樣用Java將檔案追加到zip檔案)

Java壓縮zip檔案(怎樣用Java將檔案追加到zip檔案)

學習Java壓縮zip檔案:

  1. 壓縮單個檔案和多個檔案,不包含資料夾;
  2. 怎樣用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 下面是線性表的接口,主要操作包括

新手小白LinuxCentos6.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)