2011-01-13 36 views
11

我有點困惑。我知道一個空的郵編不合法。但是關於這個示例代碼段的內容:Closing ZipOutputStream

ZipOutputStream zos = null; 
try 
{ 
    zos = new ZipOutputStream(new FileOutputStream("...")); 
    // 
    //.. 
    // 
} 
finally 
{ 
    zos.close(); 
} 

如果已經添加了某些原因(可能是特殊情況),那麼下面的異常將在關閉嘗試拋出沒有拉鍊的條目:

Exception in thread "main" java.util.zip.ZipException: ZIP file must have at least one entry 
    at java.util.zip.ZipOutputStream.finish(ZipOutputStream.java:304) 
    at java.util.zip.DeflaterOutputStream.close(DeflaterOutputStream.java:146) 
    at java.util.zip.ZipOutputStream.close(ZipOutputStream.java:321) 

在這種情況下什麼是最簡潔的方式來關閉流?

謝謝...

回答

7

您應該關閉FileOutputStream而不是ZipOutputStream,因爲前者實際上會消耗系統資源。

IOUtils類在Jakarta Commons IO找到。使用它意味着你不必處理close()可能引發的可能但很少有用的IOException

3

你應該跟蹤,如果你添加的東西的zip流,只有將其關閉時添加的東西:

ZipOutputStream zos = null; 
OutputStream file = new FileOutputStream("...") 
int itemsAdded=0; 
try 
{ 
    zos = new ZipOutputStream(file); 
    // 
    //.. 
    // itemsAdded++; 
} 
finally 
{ 
    if (itemsAdded > 0) { 
     zos.close(); 
    } else { 
     file.close(); 
    } 
} 
的,如果你不需要數

只使用一個boolean標誌。

+0

zip文件保持打開狀態,並鎖定這樣...如何關閉它? – 2011-01-13 15:10:13

+0

@lucho添加了一些代碼,以便在zip流爲空時關閉文件。看一看。 – 2011-01-13 15:13:57

3

除了在添加東西時才關閉流,我所做的是在運行郵政編碼之前檢查是否有任何東西需要壓縮。這幫助我簡化了過程,我認爲一般來說可以用來處理「ZIP文件必須至少有一個條目」的問題。確實,關閉zos可能會拋出其他例外,但這很罕見。

我認爲這是Java的問題,不處理的情況下,當沒有文件壓縮。

即:

int itemsToAdd=0; 
//.... 

if (itemsToAdd > 0) { 

    ZipOutputStream zos = new ZipOutputStream(file); 
    try { 
     //add files to zip 
    } 
    finally { 
     zos.close(); 
    } 
}