overview - what is java se 8




關閉Reader後是否需要關閉InputStream? (4)

我想知道,關閉讀卡器後,是否需要關閉InputStream?

    try {
        inputStream = new java.io.FileInputStream(file);
        reader = new InputStreamReader(inputStream, Charset.forName("UTF-8"));
    }
    catch (Exception exp) {
        log.error(null, exp);
    }
    finally {
        if (false == close(reader)) {
            return null;
        }
        // Do I need to close inputStream as well?
        if (false == close(inputStream)) {
            return null;
        }
    }

不,你不必。

由於用於Java中的流的裝飾器方法可以通過將它們附加到其他流來構建新的流或讀取器,因此這將由InputStreamReader實現自動處理。

如果查看其源InputStreamReader.java您會看到:

private final StreamDecoder sd;

public InputStreamReader(InputStream in) {
  ...
  sd = StreamDecoder.forInputStreamReader(in, this, (String)null);
  ...
}

public void close() throws IOException {
  sd.close();
}

因此,關閉操作實際上會關閉流讀取器底層的InputStream

編輯:我想確保StreamDecoder關閉也適用於輸入流,敬請關注。

StreamDecoder.java檢查它

void implClose() throws IOException {
  if (ch != null)
    ch.close();
  else
    in.close();
}

調用sd的關閉時調用。


不,你不讀者會關閉底層的InputStream


從技術上講,關閉Reader會關閉InputStream 。 但是,如果在打開InputStream和創建Reader之間出現故障,您仍應關閉InputStream 。 如果關閉InputStream [資源],則不應該有理由關閉Reader [裝飾器]。 還有一些流行的錯誤,關閉裝飾器可以在關閉裝飾之前拋出異常。 所以:

Resource resource = acquire();
try {
    Decorator decorated = decorate(resource);
    use(decorated);
} finally {
    resource.release();
}

有一些並發症需要注意。 由於實現,一些裝飾器實際上可能包含本機資源。 輸出裝飾器通常需要刷新,但僅在快樂的情況下(因此在try不是finally塊)。


根據源嗅探讀者關閉其基礎輸入流。 根據javadoc,它調用了當調用reader.close()時InputStreamReader“關閉流”。

當你做reader.close()時,我不確定任何讀者是否必須關閉它的來源。 我認為這很重要,因此無論具體類型如何,您的代碼都可以使用讀者。

無論如何,它是有道理的,它是強制執行的。





java