面试官:IO 操作必须要手动关闭吗?关闭流方法是否有顺序?

本文探讨了Java中包装流关闭时是否自动关闭底层流以及关闭流的顺序问题。实验表明,包装流的close方法会自动调用被包装流的close方法,无需手动关闭。对于关闭顺序,虽然理论上不强制,但某些情况下,如果关闭方法中包含write操作,错误的顺序可能导致IO异常。建议只关闭最外层包装流,以避免异常并确保资源有效释放。
摘要由CSDN通过智能技术生成

前几天看了一篇文章,自己动手试了下,发现有些不一样结论,作博客记录下,本文主要研究两个问题:

  • 包装流的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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值