2012年6月28日 星期四

[JAVA_程式分享]使用commons compress套件,使用壓縮檔zip、解壓縮unZip



package com.test;

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.io.PrintWriter;
import java.io.StringWriter;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;

import org.apache.commons.compress.archivers.zip.ZipArchiveEntry;
import org.apache.commons.compress.archivers.zip.ZipArchiveOutputStream;
import org.apache.commons.compress.archivers.zip.ZipFile;
import org.apache.commons.compress.utils.IOUtils;

/**
 * 
 * class name: ZipFileUtils
 * 
 * 使用Apache Commons Compress 套件
 * 
 * Apache Commons Compress software defines an API for working with compression and archive formats.
 * These include: bzip2, gzip, pack200, xz and ar, cpio, jar, tar, zip, dump.
 * 
 * 為何要使用此套件,因為使用java.util.zip套件作壓縮時,會中文檔名都會變亂碼。
 *  http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4820807
 *  http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4885817
 *  http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4244499
 * 
 * 使用說明:
 *  使用getInstance() 取得此 ZipFileUtils 物件。
 *  可使用二個public方法。
 *   1、unZip--解壓縮
 *   2、doZip--使用壓縮檔
 * 
* * @author Levin Li */ public class ZipFileUtils { /** * 設定編碼,BIG5 */ private final static String ENCODING_NAME = "BIG5"; /** * 存放解壓了那些文件明細 */ private final static List RETURN_FILE_LIST_DETAILS = new ArrayList(); /** * test * * @param args */ public static void main(String[] args) throws Exception { unZip(new File("d:/ZipTest.zip"), "d:/ZipTest"); doZip("d:/ZipTest1/ZipTest/"); } /** * 解壓指定zip文件 * ex:unZip(new File("d:/ZipTest.zip"),new File("d:/ZipTest")) * * @param pUnZipfile * 需要解壓的zip文件名 * @param pOutFileDir * 目的位置 * @return List 將解壓了那些文件明細 * @throws IOException * @author Levin Li */ public static List unZip(final File pUnZipFile, final String pOutFileDir) throws IOException { return unZip(pUnZipFile, new File(pOutFileDir)); } /** * 解壓指定zip文件 * ex:unZip(new File("d:/ZipTest.zip"), "d:/ZipTest") * * @param pUnZipFile * 需要解壓的zip文件名 * @param pOutFileDir * 目的位置 * @return List 將解壓了那些文件明細 * @throws IOException * @author Levin Li */ public static List unZip(final File pUnZipFile, final File pOutFileDir) throws IOException { ZipFile zipFile = null; try { /* * ZipFile API * :http://commons.apache.org/compress/apidocs/org/apache * /commons/compress/archivers/zip/ZipFile.html */ zipFile = new ZipFile(pUnZipFile, ENCODING_NAME); System.out.println("in pUnZipfile path:" + pUnZipFile.getPath()); for (Enumeration files = zipFile.getEntries(); files.hasMoreElements();) { ZipArchiveEntry zipArchiveEntry = files.nextElement(); /* * File.separator 用法。 該系統有關的默認名稱分隔符。 file.separator的值。 * 在UNIX系統上,此字段的值是'/',Microsoft Windows系統上,它是'\ \'。 */ File outFile = new File(pOutFileDir.getPath() + File.separator + zipArchiveEntry.getName()); // 如果指定文件的不存在,則創建. System.out.println("nuZip to file Name:" + outFile.getName()); // 這裡是指同層的檔案文件是不是目錄 if (!outFile.isDirectory()) { // 取得上一層目錄目錄創建。 if (!outFile.getParentFile().exists()) { outFile.getParentFile().mkdirs(); } /* * IOUtils API: * http://commons.apache.org/compress/apidocs/org * /apache/commons/compress/utils/IOUtils.html Copies the * content of a InputStream into an OutputStream. Uses a * default buffer size of 8024 bytes. */ copyFile(zipFile.getInputStream(zipArchiveEntry), outFile); // 加入已解壓完成的檔案資訊 RETURN_FILE_LIST_DETAILS.add(outFile); } else { System.out.println("isDirectory:" + outFile.getName()); outFile.mkdirs(); } } } catch (IOException ioe) { System.out.println("unZip Error Message:pUnZipfile path:" + pUnZipFile.getPath()); errorMessage(ioe); throw ioe; } finally { try { if (null != zipFile) { zipFile.close(); } } catch (IOException ioe) { errorMessage(ioe); throw ioe; } } return RETURN_FILE_LIST_DETAILS; } public static void doZip(final String pToZipFileSource) throws IOException { File toZipFile = new File(pToZipFileSource); // 壓縮後生成的zip文件名 String toZipFileName = toZipFile.getName() + ".zip"; String toZipDir = toZipFile.getParent() + toZipFileName; if (toZipFile.isDirectory()) { toZipDir = pToZipFileSource + toZipFileName; } doZip(toZipFile, new File(toZipDir)); } public static void doZip(final String pToZipFileSource, final String pToZipFileDir) throws IOException { doZip(new File(pToZipFileSource), new File(pToZipFileDir)); } /** *
  * doZip 此方法可以壓一個File,
  * 也可以壓一個目錄內的文件。
  * 
  * ex1:doZip("d:/ZipTest/ZipTest/test.txt", "d:/test/ZipTest.zip")
  * ex2:doZip("d:/ZipTest/ZipTest/", "d:/test/ZipTest.zip")
  * ex3:doZip("d:/ZipTest/ZipTest/")
  * 
  * 
* * @param pToZipFileSource * 目的文件夾 * @param pToZipFileDir * 要壓到那個目錄及檔名名字 * @throws IOException * @author Levin Li */ public static void doZip(final File pToZipFileSource, final File pToZipFileDir) throws IOException { ZipArchiveOutputStream zipFileOutput = null; File temp = null; try { System.out.println("檔案名稱zipDirectory:" + pToZipFileDir.getPath()); temp = File.createTempFile("temp", ".zip"); System.out.println(temp.getPath()); // 產出檔位置 zipFileOutput = new ZipArchiveOutputStream(new FileOutputStream(temp)); zipFileOutput.setEncoding(ENCODING_NAME); compress(pToZipFileSource, zipFileOutput, ""); zipFileOutput.close(); copyFile(temp, pToZipFileDir); } catch (SecurityException se) { errorMessage(se); } catch (IOException ioe) { errorMessage(ioe); } catch (Exception e) { errorMessage(e); } finally { try { if (null != zipFileOutput) { zipFileOutput.close(); } // if (null != temp) { // temp.deleteOnExit(); // } } catch (IOException ioe) { errorMessage(ioe); throw ioe; } } } /** * 判斷是目錄還是文件 * * @param pFile * 來源檔 * @param pZipArchiveOut * 輸出ZipArchiveOutputStream * @param baseDir * 在壓縮檔內的基本目錄 * @throws IOException * @author Levin Li */ private static void compress(final File pToZipFileSource, final ZipArchiveOutputStream pZipFileOutput, final String baseDir) throws IOException { /* 判斷是目錄還是文件 */ if (pToZipFileSource.isDirectory()) { compressDirectory(pToZipFileSource, pZipFileOutput, baseDir); } else { compressFile(pToZipFileSource, pZipFileOutput, baseDir); } } /** * 壓縮一個目錄,不壓縮上一層目錄名字的zip的檔 。 * * @param pToZipFileSource * 來源檔 * @param pZipArchiveOut * 輸出ZipArchiveOutputStream * @param baseDir * 在壓縮檔內的基本目錄 * @throws IOException * @author Levin Li */ private static void compressDirectory(final File pToZipFileSource, final ZipArchiveOutputStream pZipFileOutput, final String baseDir) throws IOException { File[] files = pToZipFileSource.listFiles(); for (int i = 0; i < files.length; i++) { System.out.println("files[i].getName():" + files[i].getName()); compress(files[i], pZipFileOutput, baseDir + pToZipFileSource.getName() + File.separator); } } /** * 壓縮一個文件 * * @param pFile * 來源檔 * @param pZipArchiveOut * 輸出ZipArchiveOutputStream * @param baseDir * 在壓縮檔內的基本目錄 * @throws IOException * @author Levin Li */ private static void compressFile(final File pToZipFileSource, final ZipArchiveOutputStream pZipFileOutput, final String baseDir) throws IOException { try { System.out.println("ready compression of file for:" + pToZipFileSource.getName()); pZipFileOutput.putArchiveEntry(new ZipArchiveEntry(baseDir + pToZipFileSource.getName())); copyFile(pToZipFileSource, pZipFileOutput); pZipFileOutput.closeArchiveEntry(); } catch (IOException ioe) { errorMessage(ioe); } } /** * 複製 * * @param inputFile * 來源檔File * @param outputFile * 輸出File * * @throws IOException * @author Levin Li */ private static void copyFile(File inputFile, File outputFile) throws IOException { BufferedOutputStream outputStream = new BufferedOutputStream(new FileOutputStream(outputFile)); copyFile(inputFile, outputStream); } private static void copyFile(InputStream inputStream, File outputFile) throws IOException { BufferedOutputStream outputStream = new BufferedOutputStream(new FileOutputStream(outputFile)); copyFile(inputStream, outputStream); } private static void copyFile(File inputFile, OutputStream outputStream) throws IOException { BufferedInputStream inputStream = new BufferedInputStream(new FileInputStream(inputFile)); copyFile(inputStream, outputStream); } /** * 複製 * * @param inputStream * 來源檔InputStream * @param outputStream * 輸出File * * @throws IOException * @author Levin Li */ private static void copyFile(InputStream inputStream, OutputStream outputStream) throws IOException { try { IOUtils.copy(inputStream, outputStream); } catch (IOException ioe) { errorMessage(ioe); } finally { try { if (null != outputStream) { outputStream.close(); } if (null != inputStream) { inputStream.close(); } } catch (IOException ioe) { errorMessage(ioe); } } } /** * 複製 * * @param inputFile * 來源檔InputStream * @param zipArchiveOutputStream * 輸出 * * @throws IOException * @author Levin Li */ private static void copyFile(File inputFile, ZipArchiveOutputStream zipArchiveOutputStream) throws IOException { BufferedInputStream inputStream = new BufferedInputStream(new FileInputStream(inputFile)); try { IOUtils.copy(inputStream, zipArchiveOutputStream); } catch (IOException ioe) { errorMessage(ioe); } finally { try { if (null != inputStream) { inputStream.close(); } } catch (IOException ioe) { errorMessage(ioe); } } } /** * 顯示錯誤訊息 * * @param ioe * IOException * @author Levin Li */ private static void errorMessage(Exception e) { StringWriter stringWriter = new StringWriter(); e.printStackTrace(new PrintWriter(stringWriter)); System.out.println("Error Message:" + stringWriter.toString()); } }

maven 設定

    <dependency>
<groupid>org.apache.commons</groupid>
<artifactid>commons-compress</artifactid>
<version>1.0</version>
</dependency>


download JAR

參考資料



















其它文章

沒有留言:

張貼留言

標籤

Oracle (150) Oracle DB (144) Oracle_DB (143) Oracle SQL (135) JAVA (84) css-基本類 (65) MySQL (59) CSS Selector (58) jQuery (49) JavaScript-基本類 (39) Spring Boot (38) JavaScript (37) JavaScript HTML DOM (37) JavaScript-HTML_DOM (36) CSS3 (30) JAVA-基本類 (28) jQuery UI (27) Apache (23) Oracle GROUP BY (20) datepicker (20) Android (18) Oracle Date (17) c (17) JAVA-lang套件 (16) Linux (16) Oracle Sub Query (16) Spring-基本類 (16) jQuery-基本類 (16) MySQL-進階系列教學 (15) Android基本類 (14) Grails (14) Oracle join (14) SQLite (13) Spring (13) WIN7-基本類 (13) grails-基本類 (13) linux cent os (13) CKEditor (12) JAVA-流程控制類 (12) JAVA_Spring (12) PHP (11) Spring MVC (11) MySQL-基本系列教學 (10) Notepad (10) Notepad++ (10) SQLite for java (10) Windows (10) c/c++ (10) eclipse (9) jQuery-Selector (9) sqldeveloper (9) DB_Toad (8) JAVA_IDE_Eclipse (8) JavaScript-String類 (8) MySQL DB Toad (8) MySQL-DATE相關 (8) MySQL-函式相關 (8) Spring Bean (8) Android Studio (7) HTML5 (7) Hibernate (7) JAVA-OCWCD (7) JavaScript-陣列類 (7) Docker (6) JAVA-程式分享 (6) JAVA.util套件 (6) JavaScript-數學類 (6) MinGw (6) MySQL-其它類 (6) Servlet (6) centos (6) Apache_Tomcat (5) Apache套件_POI (5) CSS (5) JavaScript-Date物件 (5) JavaScript-其它類 (5) PostgreSQL (5) httpd (5) log4j (5) 基本資訊 (5) 開發工具 (5) CSS Properties (4) Dev-C++ (4) IntelliJ IDEA (4) Oracle DDL (4) Sublime (4) TortoiseSVN (4) apache_Maven (4) Android NDK (3) Eclipse IDE for C/C++ (3) Hibernate-基本類 (3) JAVA-問題 (3) JAVA-綀習分享 (3) JVM (3) Linux 指令 (3) Proxy Server (3) Spring Mobile (3) Spring web (3) Squid (3) VirtualBox (3) maven (3) zk (3) 生活其它 (3) Bootstrap (2) Filter (2) JAVA_IO (2) JAVA_其它_itext套件 (2) JBoss-問題 (2) JSP (2) Jboss (2) Listener (2) MySQL-語法快速查詢 (2) Spring AOP (2) Spring Batch (2) Spring Boot Actuator (2) Spring i18n (2) Subversive (2) Tomcat 8 (2) UML (2) WebJars (2) WinMerge (2) c++ (2) c語言綀習題 (2) jQuery Mobile (2) jQuery-事件處理 (2) jQuery-套件類 (2) putty (2) svn (2) weblogic (2) Apache_JMeter (1) Apache套件_BeanUtils (1) Apache套件_StringUtils (1) Base64 (1) Google API (1) HTML5-基本類 (1) Heap (1) JAVA 7 (1) JAVA SE 、JAVA EE、JAVA ME (1) JAVA 日期 (1) JAVA-OCJP (1) JAVA-WEB (1) JAVA_IDE (1) JAVA其它 (1) JBoss Server (1) JDK (1) JMX (1) JRE (1) Java RMI (1) Java String (1) Joda Time (1) Linux_其它 (1) MySQL教學 (1) Oracle_VirtualBox (1) SQL Server (1) SWT (1) Session (1) Stack (1) Struts 2 (1) Tool (1) ZK Studio (1) csv (1) grails-其它類 (1) jQuery-進階 (1) java mail (1) java web (1) java8 (1) jsoup (1) mockmvc (1) modules (1) tomcat (1) win10 (1) 其它類 (1) 圖片工具 (1) 模擬器 (1) 讀書分享 (1) 開發資訊 (1)

精選文章

初學 Java 的 HelloWorld 程式

撰寫一個JAVA程式 public class HelloWorld{ public static void main(String[ ] args){ System.out.println("我第一支Java程式!!"); } } ...