2010-11-20 75 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互操作。但是,數據已成功讀取。但是,當我嘗試執行jos.write(buffer, 0, len);時,沒有數據寫入ZipOutputStream基礎的輸出流。但是,壓縮文件標題,條目註釋和中央目錄已成功寫入,因此我得到的絕對有效的zip只有一個例外,即文件爲空。

也許有人曾經見過這種行爲?任何幫助表示讚賞。

編輯 這是我真正的代碼,因爲它可能是有用的:

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 2010-11-20 18:03:26

+0

增加了一個真實的代碼 – Ola 2010-11-20 18:07:54

+0

我不知道'IDLDataHolder' - 它是一個大於零的緩衝區嗎? – thejh 2010-11-20 18:26:19

回答

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.這是從陣列寫入的字節數量。

+0

謝謝!這是一個非常愚蠢的複製和粘貼錯誤。我已經打破了我的頭調試所有這些流:) – Ola 2010-11-20 18:40:35