2016-04-25 70 views
1

我知道InputStream應該關閉。但我有些懷疑在哪裏以及如何做到這一點。沒有try/catch塊關閉InputStream?

據對IOUtils.closeQuietly文檔:

無條件關閉的InputStream。相當於 InputStream.close(),除了任何異常將被忽略。 這是 通常用於最後的塊

我的代碼中不需要try/catch塊,所以我沒有finally塊。在我的方法中返回它之前關閉InputStream是否正確,或者我應該做一些不同的事情?該方法將被多個服務用於從文件加載InputStream

public InputStream read(String filename) { 
    InputStream inputStream = Thread.currentThread().getContextClassLoader().getResourceAsStream(filename); 

    if (inputStream == null) { 
     // Throw some exception 
    } 

    IOUtils.closeQuietly(inputStream); 

    return inputStream; 
} 
+0

看你的方法,它不應該是一個關閉'InputStream'。讓調用者關閉它。 – Tunaki

+0

你爲什麼要返回'InputStream'而不是文件的內容? – ndrone

+0

@ndrone因爲還有其他的邏輯需要文件作爲'InputStream'。但這與imo問題無關。 – Diyarbakir

回答

7

你不應該叫IOUtils.closeQuietly(inputStream);在所有在此方法 - 有在返回一個封閉的流很少的一點。

然而,這種方法應該在try/finally塊被稱爲:

InputStream is = null; 
try { 
    is = read(filename); 
    // Do whatever with is. 
} finally { 
    IOUtils.closeQuietly(is); 
} 

或者try-與資源(注意註釋here說:「嘗試 - 與資源語句將消除大多數需要使用IOUtils.closeQuietly「):

try (InputStream is = read(filename)) { 
    // Do whatever with is. 
} 
+0

我有多個服務需要從文件中讀取一個'InputStream',而這個文件又需要使用'ObjectMapper'映射到某個'Object'。我想分離問題(從文件讀取,映射到對象),我想重用邏輯。我可以使用Abstract父類,靜態Utility類。我的觀點是我的閱讀方法並沒有在任何時候拋出Exception,所以我不需要try/catch。所以我沒有最後一塊。我應該還是試試/最後才圍繞它? – Diyarbakir

+0

「我的閱讀方法並沒有在任何時候拋出異常」當然,也許,現在。如果你改變方法怎麼辦?這是刪除不關閉流的可能性的最佳做法。 –

+0

感謝這裏的有用提示。我會重構我的代碼以使其更好。 – Diyarbakir

0

try/finally塊:

InputStream is = null; 嘗試InputStream = is = read(filename); //做任何事情。 } finally { is.close(); }

注意:所有的I/O資源都需要在finally塊中關閉,因爲它是在try-catch塊中初始化的。此外,還建議補充:

} catch(IOException e){ 
    e.printstacktrace(); 
} 

...異常處理

+0

也忘了--- is.flush(); –