?? java_gzip.txt
字號:
gzip是目前廣泛應用的一種壓縮方式,它具有很高的壓縮比和壓縮效率.在sun公司發布的jdk中包含了java.util.zip
包,對gzip提供了直接支持.使用java語言可以很方便的實現gzip壓縮和解壓縮.以下是一個壓縮和解壓縮的最簡程序.
(壓縮:gzip.java)
import java.io.*;
import java.util.zip.*;
public class gzip
{
public static void main(String[] args)
{
if (args.length !=2)
{
System.out.println("Usage:java gzip ");
System.exit(1);
}
try
{
//打開需壓縮文件作為文件輸入流
FileInputStream fin=new FileInputStream(args[0]);
//建立壓縮文件輸出流
FileOutputStream fout=new FileOutputStream(args[1]);
//建立gzip壓縮輸出流
GZIPOutputStream gzout=new GZIPOutputStream(fout);
byte[] buf=new byte[1024];//設定讀入緩沖區尺寸
int num;
while ((num=fin.read(buf)) != -1)
{
gzout.write(buf,0,num);
}
gzout.close();//!!!關閉流,必須關閉所有輸入輸出流.保證輸入輸出完整和釋放系統資源.
fout.close();
fin.close();
}catch(IOException e)
{
System.out.println(e);
}
}
}
(解壓縮:unzip.java)
import java.io.*;
import java.util.zip.*;
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壓縮的一個簡單例子,請大家舉一反三在自己的開發中使用.由于本人水平所限,不當之處
敬請指正.來信請寄chen@mail.dtbay.com.
(程序全部經過測試, 編譯環境:pentiumII 233,mem 160M,win98/linux,jdk1.2-jdk1.4)
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -