2011-07-19 76 views
0

我看到下面我們可以將大文件壓縮爲黑莓中GZIP的塊數據嗎?

public static byte[] compress(byte[] data) 
{ 
    try 
    { 
     ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
     GZIPOutputStream gzipStream = new GZIPOutputStream(baos, 6, GZIPOutputStream.MAX_LOG2_WINDOW_LENGTH); 
     gzipStream.write(data); 
     gzipStream.close(); 
    } 
    catch(IOException ioe) 
    { 
     return null; 
    } 

    return baos.toByteArray(); 
} 

樣品APIas但是,當我試圖用8900 OS 4.6大文件壓縮,我得到了一個「OutOfMemoryError異常」,所以我想知道如何壓縮爲一個塊小數據?

我已經使用此代碼如下嘗試,但它不工作,壓縮文件無法解壓縮......

file = (FileConnection)Connector.open(_fileOutputPath, Connector.READ_WRITE); 
      if (!file.exists()) { 
       file.create(); 
      } 
      os = file.openOutputStream(); 
      is = FileUtil.getInputStream(_fileInputPath, 0); 
      int tmpSize = 1024;   
      byte[] tmp = new byte[tmpSize]; 
      int len = -1; 
      gzipStream = new GZIPOutputStream(os, 6, GZIPOutputStream.MAX_LOG2_WINDOW_LENGTH); 
      while((len = is.read(tmp, 0, tmpSize)) != -1) { 
       gzipStream.write(tmp, 0, len); 
      } 

回答

0

GZIPOutputStream不會產生適合用gzip命令行工具使用的文件。這是因爲它不會產生必要的文件標題。你是如何測試解壓縮的?您應該編寫一個類似的使用GZIPInputStream進行測試的Java程序,因爲'gunzip'不會識別輸入。

+0

重新閱讀文檔,我認爲這是錯誤的 - RFC 1952指定了gzip文件格式。 –

0

第一個代碼示例的問題在於,ByteArrayOutputStream對於移動設備的有限內存來說太大了。

一個選項可能是首先寫入SD卡上的文件(例如)。

第二個代碼示例看起來不錯,但請參閱Michael的回答。

相關問題