JAVA下的GZIP應用

來源:互聯網
上載者:User
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壓縮的一個簡單例子,請大家舉一反三在自己的開發中使用.由於本人水平所限,不當之處


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.