2011-07-19 4 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のコマンドラインツールでの使用に適したファイルを生成しません。これは、必要なファイルヘッダーを生成しないためです。それをどのように解凍したのですか? 'gunzip'は入力を認識しないため、GZIPInputStreamを使用してテストする同様のJavaプログラムを作成する必要があります。

+0

私はこれが間違っていると思っています - RFC 1952はgzipファイル形式を指定しています。 –

0

最初のコードサンプルの問題は、ByteArrayOutputStreamがモバイルデバイスの限られたメモリに対して大きすぎることです。

オプションは、SDカードのファイル(たとえば)に最初に書き込むことができます。

2番目のコードサンプルは問題なく表示されますが、マイケルの答えを参照してください。

関連する問題