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