包装流的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调用super(out);,也就是说,out.close();调用的是通过BufferedOutputStream传入的被包装的流,这里就是FileOutputStream。
我们在看看其他类似的,比如BufferedWriter的源代码
public void close() throws IOException { synchronized (lock) { if (out == null) { return; } try { flushBuffer(); } finally { out.close(); out = null; cb = null; } } } ————————————————
一个流上的close方法可以多次调用,理论上关闭流不需要考虑顺序,但有时候关闭方法中调用了write等方法时会抛异常;
https://blog.csdn.net/maxwell_nc/article/details/49151005 |