2007年6月6日 星期三

Java的壓縮

當處理資料量大時,而記憶體或硬碟不夠大時,壓縮是ㄧ個很好的解決方案,最近開始接觸Web網頁資料處理,所面對的都是至少10GB以上的資料量,所以希望能藉助Java中內建的壓縮機制,一個簡單的範例如下:


import java.io.*;

import java.util.zip.*;
import java.util.*;

public class TestGZipString {

public TestGZipString() {
}

public static void main(String[] args){
try {

String str1 = "Test compressing string";

//壓縮,將壓縮結果存成byte陣列
ByteArrayOutputStream baout = new ByteArrayOutputStream();

GZIPOutputStream gzipout = new GZIPOutputStream(baout);
OutputStreamWriter writer = new OutputStreamWriter(gzipout);
writer.write(str1);
writer.close();

byte[] source1=baout.toByteArray(); //壓縮的結果

//解壓縮
ByteArrayInputStream bain = new ByteArrayInputStream(source1);
GZIPInputStream gzipin = new GZIPInputStream(bain);
BufferedReader reader= new BufferedReader(new InputStreamReader(gzipin));

StringBuilder sb = new StringBuilder();
String s = reader.readLine();

while (s!=null) {
sb.append(s);
s = reader.readLine();
}

System.out.println(sb.toString());
}
catch (Exception ex) {
System.out.println(ex.getMessage());
}
}
}

初步使用以上觀念試著將所壓縮的內容(byte陣列)儲存在MySQL中(Blob欄位)發現約有50%的壓縮率,雖然不如預期,但沒魚蝦也好。

另外,最初的程式用DataOutputStream而不是OutputStreamWriter,原以為只DataOutputStream有writeUTF可以處理Unicode,但實際運作時卻發現writeUTF有64k的大小限制,不得已改用OutputStreamWriter,發現處理Unicode也沒問題。

沒有留言: