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();
dodecompress(srcfile, destdir);
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;