2016-11-06 87 views
0

以下示例中是否需要關閉FileOutputStream?爲什麼?我需要關閉流嗎?

FileOutputStream fos = new FileOutputStream("bytes.info"); 
ObjectOutputStream oos = new ObjectOutputStream(fos); 
oos.writeObject(data); 
oos.close(); 
+2

如果你的意思是'OutputStream'那麼**是**你絕對會這樣做。實際上,你應該總是**使用[try-with-resources](https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html)。 –

+0

雖然我建議使用try-with-resources語句,但是'oos.close()'無論如何都會關閉FileOutputStream。 –

+0

@BoristheSpider比爲什麼這傢伙沒有關閉它在一篇文章[http://www.ibm.com/developerworks/java/library/j-5things1/index.html?S_TACT=105AGX99&S_CMP=CP] – furry

回答

2

如果沒有拋出異常,則FileOutputStream將被ooo.close()關閉。

writeObject中引發的異常會阻止任何流被關閉。所以close調用應該在最後一塊。

還有一個額外的問題,ObjectOutputStream可能會在其構造函數中拋出異常。它將流頭寫入可能導致異常的構造函數中。在這種情況下,需要關閉FileOutputStream,但不能撥打oos.close(),因爲沒有提及ObjectOutputStream。所以你真的需要兩個獨立的電話close,每個流一個,都在最後的塊。

使用try-與資源照顧這一切爲您:

try(
    FileOutputStream fos = new FileOutputStream("bytes.info"); 
    ObjectOutputStream oos = new ObjectOutputStream(fos) 
) { 
    oos.writeObject(data); 
} 
2

是的,你需要關閉流。未關閉FileOutputStream會導致已成功寫入流中的某些數據無法保存到文件中。如果一個程序打開多個文件流,但不關閉它們會由於本機資源耗盡(同時打開太多文件)而導致失敗。

FileOutputStream管理本地資源,由close方法發佈。這個類也有一個終結器,它也釋放資源。作爲釋放原生資源的一部分,如果存在任何緩衝數據,流將完成寫入。但是,由於JVM並不保證每個對象都會調用終結器,因此如果調用close失敗,則會導致保留緩衝區數據不成文的風險。

0

當然,你必須關閉FileOutputStream中的文件。如果不是有時您保存到文件中的數據可能無法保存,並且在執行程序後最終會得到一個空文件。你可能想使用資源嘗試,所以你不必手動關閉它,並可以一次執行異常處理部分。

try (FileOutputStream fos = new FileOutputStream("bytes.info"); 
ObjectOutputStream oos = new ObjectOutputStream(fos));{ 

}catch(){} 

就在,如果你不使用try與資源關閉文件流手動finally塊的情況。

FileOutputStream fos = null; 
ObjectOutputStream oos = null; 

try{ 
     fos = new FileOutputStream("bytes.info"); 
     oos = new ObjectOutputStream(fos)); 

     oos.writeObject(data); 
    }catch(){ 
    }finally{ 
     if(fos != null){ 
     fos.close(); 
     } 
     if(oos != null){ 
     oos.close(); 
     } 
    } 

這是必須檢查這些文件流是否爲空。因爲如果它們爲空,那麼會有另一個錯誤。仍然最好使用資源嘗試。

+1

[關閉](https://docs.oracle.com/javase/7/docs/api/java/io/Closeable.html)'.close()'可以拋出'IOException',所以你的第二塊應該以某種方式處理與'fos.close()'的情況下拋出它。 –