前几天看了一篇文章,自己动手试了下,发现有些不一样结论,作博客记录下,本文主要研究两个问题:
- 包装流的close方法是否会自动关闭被包装的流?
- 关闭流方法是否有顺序?
包装流的close方法是否会自动关闭被包装的流?
平时我们使用输入流和输出流一般都会使用buffer包装一下,直接看下面代码(这个代码运行正常,不会报错)
import java.io.BufferedOutputStream; import java.io.FileOutputStream; import java.io.IOException; public class IOTest { public static void main(String[] args) throws IOException { FileOutputStream fileOutputStream = new FileOutputStream("c:\\a.txt"); BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(fileOutputStream); bufferedOutputStream.write("test write something".getBytes()); bufferedOutputStream.flush(); //从包装流中关闭流 bufferedOutputStream.close(); } }
下面我们来研究下这段代码的bufferedOutputStream.close();
方法是否调用了fileOutputStream.close();
先看BufferedOutputStream
源代码:
public class BufferedOutputStream extends FilterOutputStream { ...
可以看到它继承FilterOutputStream
,并且没有重写close方法,所以直接看FilterOutputStream
的源代码:
public void close() throws IOException { try { flush(); } catch (IOException ignored) { } out.close(); }
跟踪out(FilterOutputStream
中):
protected OutputStream out; public FilterOutputStream(OutputStream out) { this.out = out; }
再看看BufferedOutputStream
中:
public BufferedOutputStream(OutputStream out) { this(out, 8192); } publi