2016-06-07 86 views
0

我正在使用ZipOutputStream將一些上下文寫入ZIP文件。我正在使用try-with-resources聲明來關閉zip流。這段代碼有味道嗎?

寫入時,我必須在ZIP流中編寫一個字符串條目內容。所以我的代碼看起來如下:

try (ZipOutputStream zos = new ZipOutputStream(...)){ 
    ... 
    zos.putNextEntry(new ZipEntry("fileName.txt")); 
    String content = "some text content here"; 
    OutputStreamWriter writer = new OutputStreamWriter(zos); //(1) 
    writer.write(content); 
    writer.flush(); 
    ... 
} 

但FindBugs顯示我行(1)中的OS_OPEN_STREAM警告。

您對此有何看法?這個代碼有味道嗎?那麼如何寫得更好?

更新。 FindBugs v.3.0.1

+0

[Code Review](http://codereview.stackexchange.com/)可能更適合這個問題。 – Gendarme

+0

相關:https://sourceforge.net/p/findbugs/bugs/786/ –

+1

@TimBiegeleisen,這是FindBugs,而不是IDE消息。此警告不適用於嘗試使用資源,但適用於OutputStreamWriter行。 – omickron

回答

0

這不是FindBugs的bug,你不要在上面的代碼中關閉writer,所以它正確的抱怨。 你應該做的例如:

try (
    ZipOutputStream zos = new ZipOutputStream(...); 
    OutputStreamWriter writer = new OutputStreamWriter(zos) 
){ 
    ... 
    zos.putNextEntry(new ZipEntry("fileName.txt")); 
    String content = "some text content here"; 
    writer.write(content); 
    writer.flush(); 
    ... 
} 
+0

你錯了,如果我關閉內部寫入器,外部流也將被關閉,所以不再有數據可以寫入流中。這是錯誤的。 – omickron

+0

你是對的,我忘記了Java以非常不明顯(混合責任)的方式做它。 –

+0

@omickron我已經更新了代碼,現在它的行爲會正確,不應該給FB錯誤。 –

0

謝謝大家。

這是一個FindBugs錯誤。

有一種方法可以避免它 - 從Apache Commons(commons-io)使用IOUtils.write。