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也沒問題。
沒有留言:
張貼留言