本文介紹了嘗試使用資源使用InputStreamReader將流包裝在哪里?的處理方法,對(duì)大家解決問題具有一定的參考價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧!
問題描述
我可能想多了,但我只是寫了代碼:
try (InputStream in = ModelCodeGenerator.class.getClassLoader().getResourceAsStream("/model.java.txt"))
{
modelTemplate = new SimpleTemplate(CharStreams.toString(new InputStreamReader(in, "ascii")));
}
這意味著InputStreamReader永遠(yuǎn)不會(huì)關(guān)閉(但在本例中,我們知道它的Close方法只關(guān)閉基礎(chǔ)InputStream。)
可以這樣寫:
try (InputStreamReader reader = new InputStreamReader(...))
但這似乎更糟糕。如果InputStreamReader出于某種原因拋出,InputStream將永遠(yuǎn)不會(huì)關(guān)閉,對(duì)嗎?這是C++中調(diào)用其他構(gòu)造函數(shù)的構(gòu)造函數(shù)的常見問題。異常可能導(dǎo)致內(nèi)存/資源泄漏。
這里有沒有最佳實(shí)踐?
推薦答案
這意味著InputStreamReader永遠(yuǎn)不會(huì)關(guān)閉
嗯?在您的代碼中,它是…它當(dāng)然也會(huì)處理您的資源流的.lose()。有關(guān)更多詳細(xì)信息,請(qǐng)參閱下面的內(nèi)容…
As @SotiriosDelimanolis mentions但是,您可以在try-with-resource語句的”resource塊”中聲明多個(gè)資源。
您現(xiàn)在有另一個(gè)問題:.getResourceAsStream()
可以返回NULL;因此您可能有NPE。
如果我是你,我會(huì)這么做:
final URL url = ModelCodeGenerator.class.getClassLoader()
.getResource("/model.java.txt");
if (url == null)
throw new IOException("resource not found");
try (
final InputStream in = url.openStream();
final Reader reader = new InputStreamReader(in, someCharsetOrDecoder);
) {
// manipulate resources
}
有一個(gè)非常重要的問題需要考慮但是…
Closeable
確實(shí)擴(kuò)展了AutoCloseable
;事實(shí)上,它的不同之處只是拋出的異常(IOException
vsException
)。但行為有根本區(qū)別。
來自AutoCloseable
的.close()
的javadoc(重點(diǎn)是我的):
請(qǐng)注意,與Closeable的Close方法不同,此Close方法不要求是冪等的。換句話說,多次調(diào)用此Close方法可能會(huì)產(chǎn)生一些明顯的副作用,這與Closeable.Close不同,Closeable.Close在多次調(diào)用時(shí)必須無效。但是,強(qiáng)烈建議此接口的實(shí)現(xiàn)者使他們的Close方法是冪等的。
確實(shí),Closeable
的javadoc對(duì)此很清楚:
關(guān)閉此流并釋放與其關(guān)聯(lián)的所有系統(tǒng)資源。如果流已經(jīng)關(guān)閉,則調(diào)用此方法不會(huì)產(chǎn)生任何效果。
您有兩點(diǎn)非常重要:
根據(jù)合同,Closeable
還負(fù)責(zé)與其關(guān)聯(lián)的所有資源;因此,如果關(guān)閉包裝了InputStream
的Reader
的BufferedReader
,則所有這三個(gè)資源都將關(guān)閉;
如果您多次調(diào)用.close()
,則不會(huì)有進(jìn)一步的副作用。
當(dāng)然,這也意味著您可以選擇Paranid選項(xiàng)并保留對(duì)所有Closeable
資源的引用,然后關(guān)閉它們;但是,如果您的混合中有AutoCloseable
資源而不是Closeable
!
,請(qǐng)注意
這篇關(guān)于嘗試使用資源使用InputStreamReader將流包裝在哪里?的文章就介紹到這了,希望我們推薦的答案對(duì)大家有所幫助,