GB | BIG5
|
| 首頁 > 編程技術 > Java > 正文 |
 |
| JAVA下的GZIP應用 |
| 本文出自:http://www.computerworld.com.cn 作者: 陳慧民 (2002-01-29 20:48:22) |
| gzip是目前廣泛應用的一種壓縮方式,它具有很高的壓縮比和壓縮效率.在sun公司發布的jdk中包含了java.util.zip |
|
包,對gzip提供了直接支持.使用java語言可以很方便的實現gzip壓縮和解壓縮.以下是一個壓縮和解壓縮的最簡程序. |
|
public static void main(String[] args) |
|
System.out.println("Usage:java gzip "); |
|
FileInputStream fin=new FileInputStream(args[0]); |
|
FileOutputStream fout=new FileOutputStream(args[1]); |
|
GZIPOutputStream gzout=new GZIPOutputStream(fout); |
|
byte[] buf=new byte[1024];//設定讀入緩沖區尺寸 |
|
while ((num=fin.read(buf)) != -1) |
|
gzout.close();//!!!關閉流,必須關閉所有輸入輸出流.保証輸入輸出完整和釋放系統資源. |
|
public static void main(String[] args) |
|
System.out.println("Usage:java ungzip "); |
|
FileInputStream fin=new FileInputStream(args[0]); |
|
GZIPInputStream gzin=new GZIPInputStream(fin); |
|
FileOutputStream fout=new FileOutputStream(args[1]); |
|
byte[] buf=new byte[1024]; |
|
while ((num=gzin.read(buf,0,buf.length)) != -1) |
|
非面向對象語言要實現保存工作數據(如一個繪圖程序保存一幅畫面的定義),往往需要一個程序數據格式轉換為外部 |
|
文件格式存儲,工作時再反向轉換的過程.實現比較麻煩,編程不透明.而java語言是一種面向對象的語言,使用它的對象序 |
|
列化特性,就可實現將工作對象(畫面定義對象數據)直接寫入硬盤,需要時再直接再讀入內存,不需任何額外操作.實現非常 |
|
方便.但由寫出對象為java類格式,因此數據冗余度較大.當數據量很大時,往往造成存儲文件很大.過多的磁盤操作也導致 |
|
數據讀入花費了更多時間,佔有了大量內存.採用gzip壓縮存儲對象是解決此類問題的有效手段.(在本人實現的一個監控系 |
|
統中,調入一幅測試畫面(10萬個組件,壓縮前7M,壓縮600K),壓縮前對如畫面內存為26M,壓縮讀入內存為12M,讀入速 |
|
java程序開發網絡應用程序是它的最大優勢,但在某些低速網絡情況下(Internet、撥號網絡).網絡往往造成傳輸瓶頸, |
|
影響應用效果,對實時性要求高的應用影響更大.採用壓縮可以有效改善通信效果. |
|
可見,在java下的對象gzip壓縮有著廣泛的應用價值.以下是一個簡單事例程序. |
|
public class Data implements Serializable//繼承串行序列化接口 |
|
(對象壓縮解壓縮類文件:compressObject.java) |
|
public final class compressObject |
|
//將Data類型數據對象序列化對象壓縮,返回字節數組,壓縮的對象數組可寫入文件保存或用網絡傳輸 |
|
public static byte[] writeCompressObject(Data object_) |
|
ByteArrayOutputStream o = new ByteArrayOutputStream(); |
|
GZIPOutputStream gzout=new GZIPOutputStream(o); |
|
ObjectOutputStream out = new ObjectOutputStream(gzout); |
|
out.writeObject(object_); |
|
public static Data readCompressObject(byte[] data_) |
|
ByteArrayInputStream i = new ByteArrayInputStream(data_); |
|
GZIPInputStream gzin=new GZIPInputStream(i); |
|
ObjectInputStream in = new ObjectInputStream(gzin); |
|
object_=(Data)in.readObject(); |
|
}catch(ClassNotFoundException e) |
|
public static void main(String[] args) |
|
Data testData_=new Data(); |
|
System.out.println("name="+testData_.name+" age="+testData_.age+" height="+testData_.height); |
|
byte[] i_=compressObject.writeCompressObject(testData_); |
|
Data o_=compressObject.readCompressObject(i_); |
|
System.out.println("name="+o_.name+" age="+o_.age+" height="+o_.height); |
|
以上只是java下應用gzip壓縮的一個簡單例子,請大家舉一反三在自己的開發中使用.由本人水平所限,不當之處 |
|
敬請指正.來信請寄chen@mail.dtbay.com. |
|
(程序全部經過測試, 編譯環境:pentiumII 233,mem 160M,win98/linux,jdk1.2-jdk1.4) |
(http://www.fanqiang.com)
進入【UNIX論壇】
|
|
| 相關文章 |
|
|
|
|
 |
★ 樊強制作 歡迎分享 ★ |