熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

Java數據壓縮格式程序設計方法

2013-11-23 19:31:44  來源: Java核心技術 

  GZIP壓縮格式簡介
  
  在JDK API中同樣定義了多種類型用於創建和解除GZIP壓縮格式數據文件的通用對象和方法用於基於JDK編寫GZIP壓縮數據管理程序
  
  GZIP壓縮格式是在Sun Solaris操作系統中廣泛采用的壓縮數據格式由於在數據壓縮過程中可以采用多種類型的壓縮算法因此壓縮文件的壓縮比很高另外在創建的壓縮文件中定義了用於表述時間和文件屬主的時戳(Time Stamp)可以使文件方便地在網絡中傳輸和交換
  
  GZIP壓縮數據文件由一系列的數字構成而各數字對應如下描述壓縮文件信息的字段
  
  ID缺省值用於標識GZIP壓縮格式
  
  ID缺省值用於標識GZIP壓縮格式
  
  CM采用的壓縮方法其值為是保留值標識采用deflate壓縮方法
  
  FLG用於標識各占用位的標志
  
  MTIME記錄了最近修改時間
  
  XFL用於標識采用壓縮算法的選項
  
  OS定義了操作系統類型
  
  XLEN定義了附加信息段的長度
  
  COMM壓縮文件說明信息
  
  CRC記錄了CRC算法采用的循環冗余校驗值
  
  上述信息完整描述了GZIP壓縮格式數據當然基於JDK開發的壓縮數據管理程序不需要明確知道上述壓縮數據定義格式只需要創建相應的管理對象並調用這些對象中定義的方法即可
  
  JDK API中ZIP壓縮格式支持對象
  
  GZIP壓縮格式是在JDK API中定義支持的另外一種數據壓縮格式由上面介紹的GZIP格式數據壓縮方法可知GZIP壓縮格式具有更大的壓縮比因此在Unix操作系統中這種類型的數據壓縮形式的應用十分普及
  
  與JDK API對ZIP壓縮格式的支持不同在JDK API中只定義了GZIPInputStream和GZIPOutputStream兩種類型的流(Stream)對象用於在基於流的數據傳輸過程中實現數據壓縮這兩個對象的繼承定義結構如下所示
  
  
  
  javalangObject
  
  |
  
  +javaioInputStream
  
  |
  
  +javaioFilterInputStream
  
  |
  
  +javautilzipInflaterInputStream
  
  |
  
  +javautilzipGZIPInputStream(javautilzipGZIPOutputStream)
  
  
  
  以采用GZIP格式進行數據輸入處理GZIPInputStream對象為例由上述對象的繼承定義結構可以看出該對象繼承了InflaterInputStream流對象需要說明的是在ZIP壓縮包中定義了Inflater和Deflater兩個對象用於基於ZLIB壓縮庫實現多種格式的數據壓縮和解壓縮因此InflaterInputStream流對象的作用是采用ZLIB庫作為數據壓縮管理的引擎而GZIPInputStream對象則進一步將流的數據加工進行細化用於讀取GZIP格式的壓縮數據同理GZIPOutputStream對象用於創建GZIP格式的壓縮數據文件下面將對兩個對象的定義內容進行說明
  
  ●GZIPInputStream
  
  對象定義結構
  
  javautilzipGZIPInputStream
  
  靜態成員變量
  
  protected CRC crc用於說明采用的數據壓縮算法為CRC
  
  protected boolean eos說明輸入流對象結束讀取輸入數據
  
  構造方法
  
  GZIPInputStream(InputStream in)采用默認的緩沖區字節數創建輸入流對象
  
  GZIPInputStream(InputStream in int size)創建由整數類型變量size指定緩沖區字節數的輸入流對象
  
  成員方法
  
  該對象只定義了如下兩個成員方法
  
  void close()關閉輸入流對象
  
  int read(byte[] buf int off int len)讀取輸入流的數據到buf字節數組中
  
  ●GZIPOutputStream
  
  對象定義結構
  
  javautilzipGZIPOutputStream
  
  靜態成員變量
  
  protected CRC crc用於說明采用的數據壓縮算法為CRC
  
  構造方法
  
  GZIPOutputStream(OutputStream out)采用默認的緩沖區字節數創建輸出流對象
  
  GZIPOutputStream(OutputStream out int size)創建由整數類型變量size指定緩沖區字節數的輸出流對象
  
  成員方法
  
  void close()關閉輸出流對象
  
  void finish()結束數據輸出但不關閉輸出流對象
  
  void write(byte[] buf int off int len)將字節數組buf中的內容壓縮輸出到輸出流對象中
  
   創建GZIP壓縮格式文件實例
  
  經過前面對JDK API中創建GZIP壓縮格式文件的相關對象的結構成員方法定義形式的說明讀者一定會問如何應用這些對象和對象中定義的成員方法呢?請讀者看下面的實例代碼
  
  
  
  //ZipDemojava
  
  import javaio*;
  
  import javautilzip*;
  
  public class GZIPDemo
  
  {
  
  public static void main(String[] args)
  
  {
  
  if (argslength !=)
  
  {
  
  Systemoutprintln("Usage:java GZIPDemo SourceFile DestnFile" + argslength);
  
  Systemexit();
  
  }
  
  try
  
  {
  
  int number;
  
  //打開需壓縮文件作為文件輸入流
  
  FileInputStream fin = new FileInputStream(args[]);
  
  //建立壓縮文件輸出流
  
  FileOutputStream fout=new FileOutputStream(args[]);
  
  //建立GZIP壓縮輸出流
  
  GZIPOutputStream gzout=new GZIPOutputStream(fout);
  
  //設定讀入緩沖區尺寸
  
  byte[] buf=new byte[];
  
  while ((number = finread(buf)) != )
  
  gzoutwrite(bufnumber);
  
  gzoutclose();
  
  foutclose();
  
  finclose();
  
  }
  
  catch(IOException e)
  
  {
  
  Systemoutprintln(e);
  
  }
  
  }
  
  }
  
  
  
  上面的程序用於將命令行中指定的文件SourceFile進行壓縮創建GZIP格式的壓縮文件DestnFile
  
  在該程序的實現代碼中首先創建用於進行文件輸入和輸出的FileInputStream和FileOutputStream對象並以FileOutputStream對象實例為參數創建GZIPOutputStream對象實例從而為創建GZIP格式壓縮文件建立數據流基礎
  
  在隨後的代碼中利用FileInputStream對象中定義的read方法從源文件中讀取待壓縮文件的內容同時利用GZIPOutputStream對象中定義的write方法將壓縮後的數據寫出到輸出文件中從而實現數據文件的GZIP格式壓縮處理
  
  在Java中創建GZIP格式壓縮文件的方法很簡單並且利用WinZipWinRAR等類型的壓縮管理軟件均能夠打開創建的GZIP格式的壓縮文件那麼如何利用JDK API中定義的對象將被壓縮的文件解壓縮呢?請讀者看下一節的內容
  
  GZIP格式文件解壓縮實例
  
  下面的程序用於將利用JDK API中定義對象的成員方法將GZIP格式壓縮文件進行解壓縮從而恢復壓縮原始文件
  
  
  
  //UnGZIPDemojava
  
  import javaio*;
  
  import javautilzip*;
  
  public class UnGZIPDemo
  
  {
  
  public static void main(String[] args)
  
  {
  
  if (argslength !=)
  
  {
  
  Systemoutprintln("Usage:java UnGZIPDemo GZIPFile DestnFile");
  
  Systemexit();
  
  }
  
  try
  
  {
  
  int number;
  
  //建立GZIP壓縮文件輸入流
  
  FileInputStream fin=new FileInputStream(args[]);
  
  //建立GZIP解壓工作流
  
  GZIPInputStream gzin=new GZIPInputStream(fin);
  
  //建立解壓文件輸出流
  
  FileOutputStream fout=new FileOutputStream(args[]);
  
  //設定讀入緩沖區尺寸
  
  byte[] buf=new byte[];
  
  while ((nnumber=gzinread(bufbuflength)) != )
  
  foutwrite(bufnnumber);
  
  gzinclose();
  
  foutclose();
  
  finclose();
  
  }
  
  catch(IOException e)
  
  {
  
  Systemoutprintln(e);
  
  }
  
  }
  
  }
  
  
  
  在GZIP格式壓縮文件解壓縮程序代碼中仍然首先創建FileInputStream和FileOutputStream對象並基於創建的FileInputStream對象創建GZIPInputStream對象在隨後的代碼中調用GZIPInputStream對象中定義的read方法在從壓縮文件中讀取數據內容並進行解壓縮處理後將解除壓縮後的數據內容利用文件輸出流對象進行輸出從而實現數據文件的解壓縮處理
  
  
From:http://tw.wingwit.com/Article/program/Java/hx/201311/27034.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.