国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發(fā)設計 > 正文

JAVA下的GZIP應用

2019-11-18 13:26:23
字體:
來源:轉載
供稿:網友

  作者: 陳慧民
  gzip是目前廣泛應用的一種壓縮方式,它具有很高的壓縮比和壓縮效率.在sun公司發(fā)布的jdk中包含了java.util.zip包,對gzip提供了直接支持.使用java語言可以很方便的實現(xiàn)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.  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];//設定讀入緩沖區(qū)尺寸
  int num;
  while ((num=fin.read(buf)) != -1)
  {
  gzout.write(buf,0,num);
  }
  gzout.close();//!!!關閉流,必須關閉所有輸入輸出流.保證輸入輸出完整和釋放系統(tǒng)資源.
  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);
  }
  }
  }
  非面向對象語言要實現(xiàn)保存工作數(shù)據(如一個繪圖程序保存一幅畫面的定義),往往需要一個程序數(shù)據格式轉換為外部文件格式存儲,工作時再反向轉換的過程.實現(xiàn)比較麻煩,編程不透明.而java語言是一種面向對象的語言,使用它的對象序列化特性,就可實現(xiàn)將工作對象(畫面定義對象數(shù)據)直接寫入硬盤,需要時再直接再讀入內存,不需任何額外操作.實現(xiàn)非常 方便.但由于寫出對象為java類格式,因此數(shù)據冗余度較大.當數(shù)據量很大時,往往造成存儲文件很大.過多的磁盤操作也導致數(shù)據讀入花費了更多時間,占有了大量內存.采用gzip壓縮存儲對象是解決此類問題的有效手段.(在本人實現(xiàn)的一個監(jiān)控系 統(tǒng)中,調入一幅測試畫面(10萬個
組件,壓縮前7M,壓縮后600K),壓縮前對如畫面后內存為26M,壓縮后讀入內存為12M,讀入速度也大幅提高.效果十分明顯).
  java程序開發(fā)網絡應用程序是它的最大優(yōu)勢,但在某些低速網絡情況下(Internet、撥號網絡).網絡往往造成傳輸瓶頸, 影響應用效果,對于實時性要求高的應用影響更大.采用壓縮可以有效改善通信效果.
  可見,在java下的對象gzip壓縮有著廣泛的應用價值.以下是一個簡單事例程序.
  (串行化的數(shù)據對象文件:Data.java)
  import java.io.*;
  import java.util.zip.*;
  public class Data implements Serializable//繼續(xù)串行序列化接口
  {
  String name="匹配";
  int age=123;
  float height=1.902f;
  }
  (對象壓縮解壓縮類文件:compressObject.java)
  import java.util.zip.*;
  import java.io.*;
  public final class compressObject
  {
  //將Data類型數(shù)據對象序列化對象壓縮,返回字節(jié)數(shù)組,壓縮后的對象數(shù)組可寫入文件保存或用于網絡傳輸
  public static byte[] writeCompressObject(Data object_)
  {
  byte[] data_=null;
  try
  {
  //建立字節(jié)數(shù)組輸出流
  ByteArrayOutputStream o = new ByteArrayOutputStream();
  //建立gzip壓縮輸出流
  GZIPOutputStream gzout=new GZIPOutputStream(o);
  //建立對象序列化輸出流
  ObjectOutputStream out = new ObjectOutputStream(gzout);
  out.writeObject(object_);
  out.flush();
  out.close();
  gzout.close();
  //返回壓縮字節(jié)流
  data_=o.toByteArray();
  o.close();
  }catch(IOException e)
  {
  System.out.println(e);
  }
  return(data_);
  }
  //將壓縮字節(jié)數(shù)組還原為Data類型數(shù)據對象
  public static Data readCompressObject(byte[] data_)
  {
  Data object_=null;
  try
  {
  //建立字節(jié)數(shù)組輸入流
  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();
  //未壓縮數(shù)據對象內容
  System.out.println("name="+testData_.name+" age="+testData_.age+" height="+testData_.height);
  //壓縮
  byte[] i_=compressObject.writeCompressObject(testData_);
  /*
  可執(zhí)行保存或網絡傳輸,需要時還原或在對端還原
  */
  //解壓縮
  Data o_=compressObject.readCompressObject(i_);
  //解壓縮后對象內容
  System.out.println("name="+o_.name+" age="+o_.age+" height="+o_.height);
  }
  }
  以上只是java下應用gzip壓縮的一個簡單例子,請大家舉一反三在自己的開發(fā)中使用.由于本人水平所限,不當之處
  敬請指正.來信請寄chen@mail.dtbay.com.
  (程序全部經過測試, 編譯環(huán)境:pentiumII 233,mem 160M,win98/linux,jdk1.2-jdk1.4)

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 荃湾区| 阳泉市| 渝中区| 东宁县| 育儿| 股票| 子洲县| 乐亭县| 山阳县| 齐河县| 武陟县| 平江县| 鱼台县| 闽侯县| 房产| 建阳市| 遵义县| 宁武县| 永平县| 家居| 舒兰市| 桐城市| 全椒县| 灵宝市| 巴中市| 麻江县| 黑水县| 汨罗市| 通河县| 台南市| 兴国县| 扎鲁特旗| 葫芦岛市| 遂溪县| 泗洪县| 忻城县| 会东县| 红河县| 南开区| 东台市| 合作市|