class="java">public static void testClose() throws Exception{ FileInputStream fi = new FileInputStream("F:\\test.txt"); InputStreamReader reader = new InputStreamReader(fi,"GBK"); BufferedReader br = new BufferedReader(reader); String line = null; while((line=br.readLine())!=null){ System.out.println(line); } System.out.println("do close");//文件不能删除 TimeUnit.SECONDS.sleep(30); br.close(); System.out.println("BufferedReader close");//文件可以删除 TimeUnit.SECONDS.sleep(30); reader.close(); System.out.println("InputStreamReader close"); TimeUnit.SECONDS.sleep(30); fi.close(); System.out.println("FileInputStream close"); }
?流关闭时只需关闭最外层的,外层流关闭时依次会调用装饰在内部的流对象的关闭方法
public void close() throws IOException { synchronized (lock) { if (in == null) return; in.close(); in = null; cb = null; } }
?in为构造函数包装的流对象,例子中为InputStreamReader
public void close() throws IOException { sd.close(); }
?sd 为StreamDecoder对象,它包装了inputStream对象,即例子中的FileInputStream对象
public void close() throws IOException { synchronized (lock) { if (!isOpen) return; implClose(); isOpen = false; } } void implClose() throws IOException { if (ch != null) ch.close(); else in.close(); }
in 上例中为FileInputStream