如下例子代碼:
從網(wǎng)站建設(shè)到定制行業(yè)解決方案,為提供網(wǎng)站設(shè)計制作、成都做網(wǎng)站服務(wù)體系,各種行業(yè)企業(yè)客戶提供網(wǎng)站建設(shè)解決方案,助力業(yè)務(wù)快速發(fā)展。創(chuàng)新互聯(lián)公司將不斷加快創(chuàng)新步伐,提供優(yōu)質(zhì)的建站服務(wù)。
FileInputStream is = new FileInputStream(".");
BufferedInputStream bis = new BufferedInputStream(is);
bis.close();
從設(shè)計模式上看:
java.io.BufferedInputStream是java.io.InputStream的裝飾類。
BufferedInputStream裝飾一個 InputStream 使之具有緩沖功能,is要關(guān)閉只需要調(diào)用最終被裝飾出的對象的 close()方法即可,因為它最終會調(diào)用真正數(shù)據(jù)源對象的 close()方法。
BufferedInputStream的close方法中對InputStream進(jìn)行了關(guān)閉,下面是jdk中附帶的源代碼:
java.io.BufferedInputStream的api:
close
public void close()throws IOException 關(guān)閉此輸入流并釋放與該流關(guān)聯(lián)的所有系統(tǒng)資源。
因此,可以只調(diào)用外層流的close方法關(guān)閉其裝飾的內(nèi)層流,驗證例子:
public static void main(String[] args) throws Exception {
FileOutputStream fos = new FileOutputStream("d:\\a.txt");
OutputStreamWriter osw = new OutputStreamWriter(fos, "UTF-8");
BufferedWriter bw = new BufferedWriter(osw);
bw.write("java IO close test");
bw.close();
}
驗證ok
是的,你的new FileReader(file)是一個匿名對象。
JVM中對于那些打開了沒有關(guān)閉的IO文件流,會在不再被使用的情況下,等到下次做Full GC的時候把他們?nèi)炕厥?,盡量少使用這種寫法。文章來自:
如果 in == null,就說明 in這個引用所指向的對象還沒有被創(chuàng)建,自然 in.close()也就不可能被執(zhí)行,而且會報異常。我是這樣想的,程序中 如果你先聲明變量
InputStream(或者其他流類型) in = null;
然后執(zhí)行其他語句,再 in = new 、、、、
在in new之前其他語句出exception,這時流沒有被打開,也就無需關(guān)閉,如果不判斷if(null != in) 硬要關(guān)閉in就出exception
另外你的代碼按如下寫會更合理:
if(null != in){
try{
in.flush();
in.close();
in = null;
}
catch(IOExection e){};
}