1. 程式人生 > >Apache Commons Compress

Apache Commons Compress

       Apache Commons是Apache軟體基金會的專案,曾隸屬於Jakarta專案。Commons的目的是提供可重用的、開源的Java程式碼。Apache Commons包含了很多開源的工具,用於解決平時程式設計經常會遇到的問題,減少重複勞動。

Compress

       本例主要介紹元件Compress,Compress是ApacheCommons提供壓縮、解壓縮檔案的類庫,可以操作ar, cpio, Unix dump, tar, zip,gzip, XZ, Pack200 and bzip2格式的檔案,功能比較強大。本例主要演示Compress操作對zip檔案壓縮與解壓縮的操作。

1、檔案壓縮成zip格式壓縮包

         /**
	 * 將檔案打包成zip壓縮包檔案
	 */
	private static void compressFiles2Zip(){
		long startInt = System.currentTimeMillis();
		File file1 = new File("D:\\logs\\log4j.log");
		File file2 = new File("D:\\logs\\log4j.log.2016-07-31-19");
		
		List<File> files = new ArrayList<File>();
		files.add(file1);
		files.add(file2);
		File zipFile = new File("D:\\logs\\log4j.log.zip");
		InputStream inputStream = null;
		ZipArchiveOutputStream zipArchiveOutputStream = null;
		try {
			zipArchiveOutputStream = new ZipArchiveOutputStream(zipFile);
			zipArchiveOutputStream.setUseZip64(Zip64Mode.AsNeeded);
			for(File file : files){
				//將每個檔案用ZipArchiveEntry封裝,使用ZipArchiveOutputStream寫到壓縮檔案
				ZipArchiveEntry zipArchiveEntry = new ZipArchiveEntry(file, "test"+File.separator+file.getName());
				zipArchiveOutputStream.putArchiveEntry(zipArchiveEntry);
				
				inputStream = new FileInputStream(file);
				byte[] buffer = new byte[1024 * 5]; 
				int len = -1;
				while((len = inputStream.read(buffer)) != -1) {
					//把緩衝區的位元組寫入到ZipArchiveEntry
					zipArchiveOutputStream.write(buffer, 0, len);
				}
			}
			zipArchiveOutputStream.closeArchiveEntry();
			zipArchiveOutputStream.finish();
		} catch (IOException e) {
//			e.printStackTrace();
		}finally{
			//關閉輸入流
			if(null!=inputStream){
				try {
					inputStream.close();
				} catch (IOException e) {
//					e.printStackTrace();
				}
			}
			//關閉輸出流
			if(null!=zipArchiveOutputStream){
				try {
					zipArchiveOutputStream.close();
				} catch (IOException e) {
//					e.printStackTrace();
				}
			}
		}
		System.out.println("耗時:"+(System.currentTimeMillis()-startInt)+"毫秒");
	}

2、zip壓縮包解壓成檔案到指定資料夾

        /**
	 * 將zip壓縮包解壓成檔案到指定資料夾
	 */
	private static void decompressZip2Files(){
		long startInt = System.currentTimeMillis();
		String zipFilePath = "D:\\logs\\log4j.log.zip";
		File zipFile = new File(zipFilePath);
		InputStream inputStream = null;
		OutputStream outputStream = null;
		//zip檔案輸入流
		ZipArchiveInputStream zipArchiveInputStream = null;
		ArchiveEntry archiveEntry = null;
		try {
			inputStream = new FileInputStream(new File(zipFilePath));
			zipArchiveInputStream = new ZipArchiveInputStream(inputStream,"UTF-8");
			while(null!=(archiveEntry = zipArchiveInputStream.getNextEntry())){
				//獲取檔名
				String archiveEntryFileName = archiveEntry.getName();
				//構造解壓後文件的存放路徑
				String archiveEntryPath = "D:\\logs\\test\\" + archiveEntryFileName;
				byte[] content = new byte[(int) archiveEntry.getSize()];
				zipArchiveInputStream.read(content);
				//把解壓出來的檔案寫到指定路徑
				File entryFile  = new File(archiveEntryPath);
				if(!entryFile.exists()){
					entryFile.getParentFile().mkdirs();
				}
				outputStream = new FileOutputStream(entryFile);
				outputStream.write(content);
				outputStream.flush();
			}
		} catch (FileNotFoundException e) {
//			e.printStackTrace();
		} catch (IOException e) {
//			e.printStackTrace();
		}finally{
			if(null!=outputStream){
				try {
					outputStream.close();
				} catch (IOException e) {
//					e.printStackTrace();
				}
			}
			if(null!=zipArchiveInputStream){
				try {
					zipArchiveInputStream.close();
				} catch (IOException e) {
//					e.printStackTrace();
				}
			}
			if(null!=inputStream){
				try {
					inputStream.close();
				} catch (IOException e) {
//					e.printStackTrace();
				}
			}
		}
		System.out.println("耗時:"+(System.currentTimeMillis()-startInt)+"毫秒");
	}

       以上分別演示zip檔案壓縮和解壓縮的過程,以下將zip檔案壓縮和解壓縮抽取成公共方法,但是其中未新增檔案格式校驗等操作,需要讀者自行補充。

package com.mahaochen.apache.commons.Compress;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import org.apache.commons.compress.archivers.ArchiveEntry;
import org.apache.commons.compress.archivers.zip.Zip64Mode;
import org.apache.commons.compress.archivers.zip.ZipArchiveEntry;
import org.apache.commons.compress.archivers.zip.ZipArchiveInputStream;
import org.apache.commons.compress.archivers.zip.ZipArchiveOutputStream;

public class CommCompressZipFileUtil {

	/**
	 * 將檔案打包成zip壓縮包檔案
	 * @param files
	 * @param targetFilePath
	 * @return
	 */
	public boolean compressFiles2Zip(File[] files,String targetFilePath){
		
		InputStream inputStream = null;
		ZipArchiveOutputStream zipArchiveOutputStream = null;
		try {
			File zipFile = new File(targetFilePath);
			zipArchiveOutputStream = new ZipArchiveOutputStream(zipFile);
			//Use Zip64 extensions for all entries where they are required
			zipArchiveOutputStream.setUseZip64(Zip64Mode.AsNeeded);
			for(File file : files){
				//將每個檔案用ZipArchiveEntry封裝,使用ZipArchiveOutputStream寫到壓縮檔案
				ZipArchiveEntry zipArchiveEntry = new ZipArchiveEntry(file, file.getName());
				zipArchiveOutputStream.putArchiveEntry(zipArchiveEntry);
				
				inputStream = new FileInputStream(file);
				byte[] buffer = new byte[1024 * 5]; 
				int len = -1;
				while((len = inputStream.read(buffer)) != -1) {
					//把緩衝區的位元組寫入到ZipArchiveEntry
					zipArchiveOutputStream.write(buffer, 0, len);
				}
			}
			zipArchiveOutputStream.closeArchiveEntry();
			zipArchiveOutputStream.finish();
		} catch (IOException e) {
//			e.printStackTrace();
			return false;
		}finally{
			//關閉輸入流
			if(null!=inputStream){
				try {
					inputStream.close();
				} catch (IOException e) {
//					e.printStackTrace();
				}
			}
			//關閉輸出流
			if(null!=zipArchiveOutputStream){
				try {
					zipArchiveOutputStream.close();
				} catch (IOException e) {
//					e.printStackTrace();
				}
			}
		}
		return true;
	}
	
	/**
	 * 將zip壓縮包解壓成檔案到指定資料夾
	 * @param zipFilePath
	 * @param targetDirPath
	 * @return
	 */
	public boolean decompressZip2Files(String zipFilePath,String targetDirPath){
		
		InputStream inputStream = null;
		OutputStream outputStream = null;
		//zip檔案輸入流
		ZipArchiveInputStream zipArchiveInputStream = null;
		ArchiveEntry archiveEntry = null;
		try {
			File zipFile = new File(zipFilePath);
			inputStream = new FileInputStream(zipFile);
			zipArchiveInputStream = new ZipArchiveInputStream(inputStream,"UTF-8");
			
			while(null!=(archiveEntry = zipArchiveInputStream.getNextEntry())){
				//獲取檔名
				String archiveEntryFileName = archiveEntry.getName();
				//構造解壓後文件的存放路徑
				String archiveEntryPath = targetDirPath + archiveEntryFileName;
				//把解壓出來的檔案寫到指定路徑
				File entryFile  = new File(archiveEntryPath);
				if(!entryFile.exists()){
					entryFile.getParentFile().mkdirs();
				}
				byte[] buffer = new byte[1024 * 5];
				outputStream = new FileOutputStream(entryFile);
				int len = -1;
				while((len = zipArchiveInputStream.read(buffer)) != -1){
					outputStream.write(buffer,0,len);
				}
				outputStream.flush();
			}
		} catch (FileNotFoundException e) {
//			e.printStackTrace();
			return false;
		} catch (IOException e) {
//			e.printStackTrace();
			return false;
		}finally{
			if(null!=outputStream){
				try {
					outputStream.close();
				} catch (IOException e) {
//					e.printStackTrace();
				}
			}
			if(null!=zipArchiveInputStream){
				try {
					zipArchiveInputStream.close();
				} catch (IOException e) {
//					e.printStackTrace();
				}
			}
			if(null!=inputStream){
				try {
					inputStream.close();
				} catch (IOException e) {
//					e.printStackTrace();
				}
			}
		}
		return true;
	}
}



相關推薦

Apache Commons Compress

       Apache Commons是Apache軟體基金會的專案,曾隸屬於Jakarta專案。Commons的目的是提供可重用的、開源的Java程式碼。Apache Commons包含了很多開源的工具,用於解決平時程式設計經常會遇到的問題,減少重複勞動。 Compr

使用apache.commons.compress壓縮和加壓檔案工具類

package com.my.common.utils; import lombok.extern.slf4j.Slf4j; import org.apache.commons.compress.archivers.ArchiveEntry; import o

commons-compress(apache壓縮工具包)

一、新增壓縮檔案: package aaaaa.my.test.cmdoption; import java.io.File; import java.io.FileOutputStream; import java.io.OutputStream; import java.io.PrintWrit

Apache Commons Digester 二(規則模塊綁定-RulesModule、異步解析-asyncParse、xml變量Substitutor、帶參構造方法)

對象 property 解決 space getclass bool trace throw object 前言 上一篇對Digester做了基本介紹,也已經了解了Digester的基本使用方法,接下來將繼續學習其相關特性,本篇主要涉及以下幾個內容: 規則模塊綁定,

【FTP】org.apache.commons.net.ftp.FTPClient實現復雜的上傳下載,操作目錄,處理編碼

ttr hide working log 登錄 有一個 ima spl att 和上一份簡單 上傳下載一樣 來,任何的方法不懂的,http://commons.apache.org/proper/commons-net/apidocs/org/apache/commons/

使用commons-compress操作zip文件(壓縮和解壓縮)

文件路徑 equal where lis catch cfile tarc finish 返回 http://www.cnblogs.com/luxh/archive/2012/06/28/2568758.html Apache Commons Compr

java.lang.NoClassDefFoundError: org/apache/commons/lang3/StringUtils

apache con ont test oca action error esp iat 1.java.lang.NoClassDefFoundError: org/apache/commons/lang3/StringUtils 缺少類 2. There is no Ac

java.lang.ClassNotFoundException: org.apache.commons.dbutils.QueryRunner

ica ror server acc dwr comm erro tor reads 七月 28, 2017 11:06:33 下午 org.apache.catalina.core.StandardWrapperValve invoke嚴重: Servlet.serv

使用Apache Commons IO組件讀取大文件

utils apache 普通 out right ack close 一次 solid Apache Commons IO讀取文件代碼如下: Files.readLines(new File(path), Charsets.UTF_8); FileUtils.readLi

Apache commons-vfs2

vfs java 依賴:<dependencies> <!-- https://mvnrepository.com/artifact/org.apache.commons/commons-vfs2 --> <dependency> &

Apache commons(Java常用工具包)簡介

機制 encode 解析 help IT PE tom base cit Apache Commons是一個非常有用的工具包,解決各種實際的通用問題,下面是一個簡述表,詳細信息訪問http://jakarta.apache.org/commons/index.html Be

Caused by: java.lang.ClassNotFoundException: org.apache.commons.logging.LogFactory

pro .com spa exception nbsp build 下載 .org col 運行一個Spring程序的時候,一直報錯,如下: 解決辦法: 下載 :commons-logging-1.2.jar包 地址:http://commons

對於org.apache.commons.dbcp.BasicDataSource的配置認知

使用 回滾 路徑 blog 出錯 ati 方式 factory 忽略 對於org.apache.commons.dbcp.BasicDataSource的配置認知 對於org.apache.commons.dbcp.BasicDataSource的配置認知【轉】 S

基於Apache-Commons-Pool2實現Grpc客戶端連接池

i++ exc fin checked count() tcl 抽象 bdd process 概述 在項目運行過程中,有些操作對系統資源消耗較大,比如建立數據庫連接、建立Redis連接等操作,我們希望一次性創建多個連接對象,並在以後需要使用時能直接使用已創建好的連接,達到提

Apache Commons IO之FileUtils的常用方法

unit 文件系統 全部 string類 force 輸出 cfi 異常 兩個文件 Apache Commons IO 在學習io流的時候研究(翻譯)了一下這個,只有FileUtils的某些方法,並不全面,還請諒解 org.apache.commons.io 這個包下定義了

Apache Commons-Codec的使用

Coding enc des turn 1.10 commons ati tac end 處理常用的編碼方法的工具類包 例如DES、SHA1、MD5、Base64等. 導入包: <!-- 這個是編碼解碼的 --><dependency> <g

java中反向轉義org.apache.commons.lang3.StringEscapeUtils.unescapeJava

style javascrip 內容 ons 字符 set htm templates 關鍵字 工具類中包含類反向轉義的方法: eorderHistory.setSubPrintTemplates(StringEscapeUtils.unescapeJava(eord

APACHE COMMONS LOGGING

Contents Introduction Quick Start Configuration Configuring The Underlying Logging System Configuring Log4J

Cannot find class [org.apache.commons.dbcp.BasicDataSource] for bean with name 'dataSource' defined in class path resource [applicationContext

Cannot find class [org.apache.commons.dbcp.BasicDataSource] for bean with name 'dataSource' defined in class path resource [applicationContext.xml]; 該錯誤是因

org.apache.commons.dbcp.SQLNestedException: Cannot create PoolableConnectionFactory (Communications

The last packet successfully received from the server was 1,540,276,322,598 milliseconds ago. The last packet sent successfully to the server was 0 m