2014/06/05

[C# & Java] .Net 壓縮(GZipStream) VS. Java解壓縮

簡單說明需求:

  1. 利用 .Net 程式將一個 PDF 檔案壓縮, 並將其轉為BASE64字串.
  2. 呼叫一個 Java 的 Web Service, 將此 BASE64 字串傳送到另一端.
  3. Java 程式要轉換此 BASE64 字串, 並回存成 PDF 檔案.




這邊省略掉 Web Service 的傳輸說明, 僅說明 .Net 程式的壓縮與轉換 BASE64, 以及 Java 程式的 BASE64 轉換與解壓縮.

  • .Net C# 程式:
    // 讀取 PDF 檔案
    byte[] fileData = File.ReadAllBytes(@"C:\test.pdf");
    // 用來儲存最後轉換為 BASE64 字串的變數
    string cmpData = string.Empty;
    // 將檔案資料轉至 MemoryStream
    using (MemoryStream msIn = new MemoryStream(fileData))
    {
      // 建立輸出的 MemoryStream
      using (MemoryStream msOut = new MemoryStream())
      {
        // 建立 GZipStream, 設定輸出的 MemoryStream, 以及壓縮模式
        using (GZipStream gzIn = new GZipStream(msOut, CompressionMode.Compress))
        {
          byte[] bytes = new byte[4096];
          int cnt;
          // 從 msIn 讀取資料, 透過 gzIn 將資料壓縮後, 輸出至 msOut 
          while ((cnt = msIn.Read(bytes, 0, bytes.Length)) != 0)
          {
            gzIn.Write(bytes, 0, cnt);
          }
        }
        // 利用 Convert 將 byte[] 轉為 BASE64 字串
        cmpData = Convert.ToBase64String(msOut.ToArray());
      }
    }
    
  • Java 程式:
    以下程式預計用到的 class 如下:
    java.util.zip.GZIPInputStream
    java.io.FileOutputStream
    org.apache.commons.codec.binary.Base64
    // 假設此字串是 .Net 程式傳過來的BASE64字串
    String dataString = "xxxxxxxxxxx";
    // 1. 利用 Apache Commons Codec 套件中的 Base64 類別轉換 BASE64 字串
    // 2. 使用 ByteArrayInputStream 將 byte[] 傳至 Stream 類別
    // 3. 利用 GZIPInputStream 處理此壓縮資料
    GZIPInputStream gis = new GZIPInputStream(
           new ByteArrayInputStream(Base64.decodeBase64(dataString)));
    // 建立一個檔案輸出的 FileOutputStream
    FileOutputStream fout = new FileOutputStream("C:\\data.pdf");
    int c;
    // 將解壓縮的資料輸出至檔案
    while((c = gis.read()) != -1) {
      fout.write(c);
    }
    // 關閉 Streams
    fout.close();
    gis.close();
    




Apache Commons Codec 套件可至 http://commons.apache.org/proper/commons-codec/download_codec.cgi 下載.
PS. 有人可能會發現執行GZip後, 資料反而變大了. 原因出在一些資料(EX: PDF)本身就已經有經過壓縮的技術, 再壓縮一次不一定比較好.

沒有留言: