[英]Java - close multi-layer stream wrapper
在Java中,我們通常使用流對象來包裝另一個流類以提高效率。 例如:
Object obj = new MyClass();
try {
FileOutputStream fos = new FileOutputStream("test.txt");
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(obj);
oos.flush();
} catch(IOException e) {
e.printStackTrace();
} finally {
fos.close();
oos.close();
}
我使用ObjectOutputStream
來包裝FileOutputStream
。 類似的情況是使用BufferedReader
來包裝InputStreamReader
。
我的問題是如何正確地關閉fos
和oos
。 應該先關閉哪一個? 或者只需要關閉其中任何一個。 通常關閉兩個流都可以工作,但我對這種方式感到不舒服,因為我不理解語義。 我只是使用close方法關閉所有內容,而我不知道為什么不關閉fos
或oos
。
關閉包裝器流會自動關閉內部流。
因此,在您的情況下,您只需要關閉ObjectOutputStream
。 關閉一個流兩次不會引發異常,因此您已經在做的事情(盡管不必要)也可以。
以下是實例化ObjectOutputStream
時發生的情況
public ObjectOutputStream(OutputStream out) throws IOException {
bout = new BlockDataOutputStream(out); // inner stream being wrapped
...
}
這是ObjectOutputStream.close()
的實現
public void close() throws IOException {
flush();
clear();
bout.close(); // inner stream being closed
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.