2010-11-20 10 views
3

あるストリームから来ているデータを圧縮し、別のストリームにデータを保存する必要があります。以下は、ファイルで動作するコードです(MyOutputStreamは、デバッグ目的で使用される単純なFileOutputStreamラッパーです)。このコードは正常に動作します。ZipOutputStreamはファイルの内容を書きません

 ZipOutputStream jos = new ZipOutputStream(new MyOutputStream(new FileOutputStream(zipFileName))); 
     jos.setLevel(Deflater.DEFAULT_COMPRESSION); 
     jos.putNextEntry(new ZipEntry("test.txt")); 
     FileInputStream in = new FileInputStream("test.txt"); 

     int len; 
     while ((len = in.read(buffer)) > 0){ 
      jos.write(buffer, 0, len); 
     } 
     jos.closeEntry(); 
     jos.close(); 

実際のアプリケーションでは、より複雑なストリームに対処する必要があります。実際、ストリームはCORBA interopに使用されます。ただし、データは正常に読み取られます。しかし、私がしようとすると、は、ZipOutputStreamの基礎となる出力ストリームにデータが書き込まれません。しかし、zipファイルのヘッダー、エントリのコメントと中央ディレクトリは正常に書き込まれているので、ファイルが空であるという唯一の例外を持つ絶対的に有効なzipが得られます。

誰かがこの行動を以前に見たことがありますか?どんな助けもありがとうございます。

EDITそれは有用である可能性があるとして、ここでは は私の実際のコードです:

String fileName = fullSourcePath.substring(fullSourcePath.lastIndexOf('\\') + 1, fullSourcePath.length()); 
WrapperOutputStream out = new WrapperOutputStream(newexchangeStream64); 
ZipOutputStream jos = new ZipOutputStream(out); 
jos.setLevel(Deflater.NO_COMPRESSION); 

jos.putNextEntry(new ZipEntry(fileName)); 
jos.setComment("Comment"); 
IDLDataHolder data = new IDLDataHolder(); 
LongHolder dataAmount = new LongHolder(); 
LongHolder written = new LongHolder(); 

while (true) { 
    exchangeStream64.Read(data, READ_AMOUNT, dataAmount); 
    if (0 == dataAmount.value) { 
     break; 
    } 

    jos.write(data.value, (int)dataAmount.value, (int)written.value); 
} 
jos.closeEntry(); 
jos.close(); 
+0

あなたはアプリケーションからその特定の部分を投稿できますか?それとも大きすぎますか? – thejh

+0

実際のコードが追加されました – Ola

+0

'IDLDataHolder'は分かりません - サイズが0より大きいバッファですか? – thejh

答えて

2
LongHolder written = new LongHolder(); 

while (true) { 
    exchangeStream64.Read(data, READ_AMOUNT, dataAmount); 
    if (0 == dataAmount.value) { 
     break; 
    } 

    jos.write(data.value, (int)dataAmount.value, (int)written.value); 
} 

それはここだけコピー&ペースト間違いかもしれないが、jos.writeの最後のパラメータが常にありますこれは、配列から書き込むバイト数です。

+0

ありがとう!これは本当に愚かなコピー&ペーストミスです。私はすべてのこれらのストリームをデバッグ私の頭が壊れてしまった:) – Ola

関連する問題