以下示例中是否需要關閉FileOutputStream?爲什麼?我需要關閉流嗎?
FileOutputStream fos = new FileOutputStream("bytes.info");
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(data);
oos.close();
以下示例中是否需要關閉FileOutputStream?爲什麼?我需要關閉流嗎?
FileOutputStream fos = new FileOutputStream("bytes.info");
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(data);
oos.close();
如果沒有拋出異常,則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);
}
是的,你需要關閉流。未關閉FileOutputStream
會導致已成功寫入流中的某些數據無法保存到文件中。如果一個程序打開多個文件流,但不關閉它們會由於本機資源耗盡(同時打開太多文件)而導致失敗。
FileOutputStream
管理本地資源,由close
方法發佈。這個類也有一個終結器,它也釋放資源。作爲釋放原生資源的一部分,如果存在任何緩衝數據,流將完成寫入。但是,由於JVM並不保證每個對象都會調用終結器,因此如果調用close
失敗,則會導致保留緩衝區數據不成文的風險。
當然,你必須關閉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();
}
}
這是必須檢查這些文件流是否爲空。因爲如果它們爲空,那麼會有另一個錯誤。仍然最好使用資源嘗試。
[關閉](https://docs.oracle.com/javase/7/docs/api/java/io/Closeable.html)'.close()'可以拋出'IOException',所以你的第二塊應該以某種方式處理與'fos.close()'的情況下拋出它。 –
如果你的意思是'OutputStream'那麼**是**你絕對會這樣做。實際上,你應該總是**使用[try-with-resources](https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html)。 –
雖然我建議使用try-with-resources語句,但是'oos.close()'無論如何都會關閉FileOutputStream。 –
@BoristheSpider比爲什麼這傢伙沒有關閉它在一篇文章[http://www.ibm.com/developerworks/java/library/j-5things1/index.html?S_TACT=105AGX99&S_CMP=CP] – furry