簡體   English   中英

Java - 關閉多層流包裝器

[英]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

我的問題是如何正確地關閉fosoos 應該先關閉哪一個? 或者只需要關閉其中任何一個。 通常關閉兩個流都可以工作,但我對這種方式感到不舒服,因為我不理解語義。 我只是使用close方法關閉所有內容,而我不知道為什么不關閉fosoos

關閉包裝器流會自動關閉內部流。

因此,在您的情況下,您只需要關閉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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM