2011-11-30 99 views
0

我有一個方法,拉鍊5個文件。它會產生一個沒有錯誤的zip文件,但我無法打開它來檢查內容。我嘗試通過電子郵件發送,而gmail說它不能發送損壞的文件。試圖在Windows中使用WinRAR打開導致錯誤,指出:這種zip方法有什麼問題?

的檔案或者是在未知的格式或損壞

這是方法:

private void zipTestFiles() throws FileNotFoundException, IOException 
{ 
    File[] filenames = fileDir.listFiles(fileNameFilter(Constants.PAGE_MON_FILENAME_FILTER)); 

    byte[] buf = new byte[1024]; 

    String outFilename = Environment.getExternalStorageDirectory().getAbsolutePath() + File.separatorChar + Constants.PAGEMONITOR_ZIP; 
    DeflaterOutputStream out = new DeflaterOutputStream(new BufferedOutputStream(new FileOutputStream(outFilename))); 

    for (int i=0; i<filenames.length; i++) 
    { 
     FileInputStream in = new FileInputStream(filenames[i]); 

     int len; 
     while ((len = in.read(buf)) > 0) 
     { 
      out.write(buf, 0, len); 
     } 

     in.close(); 
     } 
    out.close(); 
} 
+0

你有沒有試過用它來壓縮一個文件? – ethan

+0

ZIP文件是您的文件的縮小表示,再加上一些標題。可能你的應用程序會產生前者,但會遺漏後者,所以錯誤。我認爲@ AlexR的答案是正確的。 – akappa

+0

@akappa它確實是... – barry

回答

3

您應該使用ZipOutputStream而不是DeflaterOutputStream。不要忘記創建條目。在編寫實現之前閱讀ZipOutputStream的javadoc。

+0

謝謝亞歷克斯。我實際上是在週末使用ZipOutputStream工作,但遇到了.setMethod()問題(在試驗.setMethod(ZipOutputStream.STORED)時,我不斷收到CRC錯誤;)所以我想嘗試DeflateOutputStream。現在都在工作。 – barry

3

嘗試使用已經存在於Java中的ZipOutputStream。 DeflaterOutputStream只使用DEFLATE方法進行壓縮,但不會自動添加ZIP標頭。

+0

這工作,謝謝。 – barry

相關問題