public class ungzip
{
public static void main(String[] args)
{
if (args.length !=2)
{
System.out.println("Usage:java ungzip ");
System.exit(1);
}
try
{
//建立gzip壓縮檔輸入資料流
FileInputStream fin=new FileInputStream(args[0]);
//建立gzip解壓工作流程
GZIPInputStream gzin=new GZIPInputStream(fin);
//建立解壓檔案輸出資料流
FileOutputStream fout=new FileOutputStream(args[1]);
byte[] buf=new byte[1024];
int num;
while ((num=gzin.read(buf,0,buf.length)) != -1)
{
fout.write(buf,0,num);
}
gzin.close();
fout.close();
fin.close();
}catch(IOException e)
{
System.out.println(e);
}
}
}
非物件導向語言要實現儲存工作資料(如一個繪圖程式儲存一幅畫面的定義),往往需要一個程式資料格式轉換為外部
檔案格式儲存,工作時再反向轉換的過程.實現比較麻煩,編程不透明.而java語言是一種物件導向的語言,使用它的對象序
列化特性,就可實現將工作對象(畫面定義對象資料)直接寫入硬碟,需要時再直接再讀入記憶體,不需任何額外操作.實現非常
方便.但由於寫出對象為java類格式,因此資料冗餘度較大.當資料量很大時,往往造成隱藏檔很大.過多的磁碟操作也導致
資料讀入花費了更多時間,佔有了大量記憶體.採用gzip壓縮儲存物件是解決此類問題的有效手段.(在本人實現的一個監控系
統中,調入一幅測試畫面(10萬個組件,壓縮前7M,壓縮後600K),壓縮前對如畫面後記憶體為26M,壓縮後讀入記憶體為12M,讀入速
度也大幅提高.效果十分明顯).
java程式開發網路應用程式是它的最大優勢,但在某些低速網路情況下(Internet、撥號網路).網路往往造成傳輸瓶頸,
影響應用效果,對於即時性要求高的應用影響更大.採用壓縮可以有效改善通訊效果.
可見,在java下的對象gzip壓縮有著廣泛的應用價值.以下是一個簡單案例程式.
(序列化的資料對象檔案:Data.java)
import java.io.*;
import java.util.zip.*;
public class Data implements Serializable//繼承串列序列化介面
{
String name="匹配";
int age=123;
float height=1.902f;
}
(對象壓縮解壓縮類檔案:compressObject.java)
import java.util.zip.*;
import java.io.*;
public final class compressObject
{
//將Data類型資料對象序列化對象壓縮,返回位元組數組,壓縮後的對象數組可寫入檔案儲存或用於網路傳輸
public static byte[] writeCompressObject(Data object_)
{
byte[] data_=null;
try
{
//建立位元組數組輸出資料流
ByteArrayOutputStream o = new ByteArrayOutputStream();
//建立gzip壓縮輸出資料流
GZIPOutputStream gzout=new GZIPOutputStream(o);
//建立對象序列化輸出資料流
ObjectOutputStream out = new ObjectOutputStream(gzout);
out.writeObject(object_);
out.flush();
out.close();
gzout.close();
//返回壓縮位元組流
data_=o.toByteArray();
o.close();
}catch(IOException e)
{
System.out.println(e);
}
return(data_);
}
//將壓縮位元組數組還原為Data類型資料對象
public static Data readCompressObject(byte[] data_)
{
Data object_=null;
try
{
//建立位元組數組輸入資料流
ByteArrayInputStream i = new ByteArrayInputStream(data_);
//建立gzip解壓輸入資料流
GZIPInputStream gzin=new GZIPInputStream(i);
//建立對象序列化輸入資料流
ObjectInputStream in = new ObjectInputStream(gzin);
//按制定類型還原對象
object_=(Data)in.readObject();
i.close();
gzin.close();
in.close();
}catch(ClassNotFoundException e)
{
System.out.println(e);
}catch(IOException e)
{
System.out.println(e);
}
return(object_);
}
}
(主程式:test.java)
import java.io.*;
import java.util.zip.*;
public class test
{
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壓縮的一個簡單例子,請大家舉一反三在自己的開發中使用.由於本人水平所限,不當之處