inkfish原創,請勿商業性質轉載,轉載請註明來源(http://blog.csdn.net/inkfish)。
壓縮是編程中常見的技巧,多用於大檔案壓縮,資料流壓縮等。在Java類庫中,內建了jar、ZIP、GZIP、ZLIB等的支援(見java.util.zip、java.util.jar包)。另外在Apache項目下Ant中ant.jar的org.apache.tools.tar、org.apache.tools.zip、org.apache.tools.bzip2分別提供了tar、zip、bzip2的支援;Apache commons compress項目裡提供了對AR、BZIP、CPIO、GZP、TAR、ZIP的支援。7-zip 提供了LZMA格式的壓縮(public domain),QuickLZ 提供了quicklz格式的壓縮(GPL),oberhumer.com 提供LZO格式的壓縮(GPL),hadoop-gpl-compression 則對LZO的c實現用JNI進行封裝,提供更快捷的LZO壓縮。(來源:http://blog.csdn.net/inkfish)
嚴格來說,TAR、AR、CPIO並不屬於壓縮軟體,而是一種打包軟體,它能把很多檔案、檔案夾打包成一個檔案,供壓縮程式壓縮。而咱們在windows中熟悉的zip、rar,嚴格的說是具備打包和壓縮功能的一種格式。(來源:http://blog.csdn.net/inkfish)
因為本人在項目中需主要需要應用壓縮公用程式對網路中傳輸的資料流進行壓縮,因此重點關心對Stream的壓縮,而不關心對多個檔案的壓縮,這在代碼中也會有所體現。因此,本系列的代碼一般僅適用於壓縮流或壓縮一個檔案。(來源:http://blog.csdn.net/inkfish)
LZMA、QuickLZ、LZO因為提供的類庫不支援stream形式壓縮或提供的example太難看懂,故不作測試。這裡還有一個需要提醒,Apache commons compress的tar、zip、bzip2來最初源於ant,但經過項目間遷移、演化,API及效能有所不同。(來源:http://blog.csdn.net/inkfish)
所有的格式均提供壓縮和解壓兩個方法,再次提醒這裡所有代碼不適用於壓縮多個檔案、檔案夾。下面是抽象的壓縮、加壓縮類:(來源:http://blog.csdn.net/inkfish)
package study.inkfish.compress; import java.io.File; import java.io.IOException; public abstract class Compress { public void compress(File srcFile, File destFile) { destFile.getParentFile().mkdirs(); try { doCompress(srcFile, destFile); } catch (IOException ex) { ex.printStackTrace(); } } public void decompress(File srcFile, File destDir) { destDir.mkdirs(); try { doDecompress(srcFile, destDir); } catch (IOException ex) { ex.printStackTrace(); } } protected int bufferLen = 1024 * 1024;//buffer size: 1MByte protected abstract void doCompress(File srcFile, File destFile) throws IOException; protected abstract void doDecompress(File srcFile, File destDir) throws IOException; }