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)對象
用於在基於流的數據傳輸過程中實現數據壓縮
這兩個對象的繼承定義結構如下所示
java
lang
Object
|
+
java
io
InputStream
|
+
java
io
FilterInputStream
|
+
java
util
zip
InflaterInputStream
|
+
java
util
zip
GZIPInputStream(java
util
zip
GZIPOutputStream)
以采用GZIP格式進行數據輸入處理GZIPInputStream對象為例
由上述對象的繼承定義結構可以看出
該對象繼承了InflaterInputStream流對象
需要說明的是
在ZIP壓縮包中
定義了Inflater和Deflater兩個對象
用於基於ZLIB壓縮庫實現多種格式的數據壓縮和解壓縮
因此
InflaterInputStream流對象的作用是采用ZLIB庫作為數據壓縮管理的引擎
而GZIPInputStream對象則進一步將流的數據加工進行細化
用於讀取GZIP格式的壓縮數據
同理
GZIPOutputStream對象用於創建GZIP格式的壓縮數據文件
下面
將對兩個對象的定義內容進行說明
●GZIPInputStream
對象定義結構
java
util
zip
GZIPInputStream
靜態成員變量
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
對象定義結構
java
util
zip
GZIPOutputStream
靜態成員變量
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壓縮格式文件的相關對象的結構
成員方法定義形式的說明
讀者一定會問如何應用這些對象和對象中定義的成員方法呢?請讀者看下面的實例代碼
//ZipDemo
java
import java
io
*;
import java
util
zip
*;
public class GZIPDemo
{
public static void main(String[] args)
{
if (args
length !=
)
{
System
out
println("Usage:java GZIPDemo SourceFile DestnFile" + args
length);
System
exit(
);
}
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 = fin
read(buf)) !=
)
gzout
write(buf
number);
gzout
close();
fout
close();
fin
close();
}
catch(IOException e)
{
System
out
println(e);
}
}
}
上面的程序用於將命令行中指定的文件SourceFile進行壓縮
創建GZIP格式的壓縮文件DestnFile
在該程序的實現代碼中
首先創建用於進行文件輸入和輸出的FileInputStream和FileOutputStream對象
並以FileOutputStream對象實例為參數創建GZIPOutputStream對象實例
從而為創建GZIP格式壓縮文件建立數據流基礎
在隨後的代碼中
利用FileInputStream對象中定義的read方法
從源文件中讀取待壓縮文件的內容
同時利用GZIPOutputStream對象中定義的write方法將壓縮後的數據寫出到輸出文件中
從而實現數據文件的GZIP格式壓縮處理
在Java中創建GZIP格式壓縮文件的方法很簡單
並且利用WinZip
WinRAR等類型的壓縮管理軟件均能夠打開創建的GZIP格式的壓縮文件
那麼
如何利用JDK API中定義的對象將被壓縮的文件解壓縮呢?請讀者看下一節的內容
GZIP格式文件解壓縮實例
下面的程序用於將利用JDK API中定義對象的成員方法
將GZIP格式壓縮文件進行解壓縮
從而恢復壓縮原始文件
//UnGZIPDemo
java
import java
io
*;
import java
util
zip
*;
public class UnGZIPDemo
{
public static void main(String[] args)
{
if (args
length !=
)
{
System
out
println("Usage:java UnGZIPDemo GZIPFile DestnFile");
System
exit(
);
}
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=gzin
read(buf
buf
length)) !=
)
fout
write(buf
nnumber);
gzin
close();
fout
close();
fin
close();
}
catch(IOException e)
{
System
out
println(e);
}
}
}
在GZIP格式壓縮文件解壓縮程序代碼中
仍然首先創建FileInputStream和FileOutputStream對象
並基於創建的FileInputStream對象創建GZIPInputStream對象
在隨後的代碼中
調用GZIPInputStream對象中定義的read方法
在從壓縮文件中讀取數據內容並進行解壓縮處理後
將解除壓縮後的數據內容利用文件輸出流對象進行輸出
從而實現數據文件的解壓縮處理
小
From:http://tw.wingwit.com/Article/program/Java/hx/201311/27034.html