当我关闭缓冲输入流时,基础输入流是否也已关闭?

2022-09-02 05:38:23
InputStream in = SomeClass.getInputStream(...);
BufferedInputStream bis = new BufferedInputStream(in);

try {
    // read data from bis
} finally {
    bis.close();
    in.close();    
}

的 javadoc 没有提到底层流是否已关闭:BufferedInputStream.close()

关闭此输入流并释放与该流关联的任何系统资源。一旦流被关闭,进一步的 read()、available()、reset() 或 skip() 调用将引发 IOException。关闭以前关闭的流不起作用。

显式调用是必需的,还是应该通过调用 来关闭?in.close()bis.close()


答案 1

来自 BufferedInputStream 的源代码:

public void close() throws IOException {
    byte[] buffer;
    while ( (buffer = buf) != null) {
        if (bufUpdater.compareAndSet(this, buffer, null)) {
            InputStream input = in;
            in = null;
            if (input != null)
                input.close();
            return;
        }
        // Else retry in case a new buf was CASed in fill()
    }
}

所以答案是:是的


答案 2

BufferedInputStream本身不保存任何系统资源;它只是简单地围绕着一个保存这些资源的输入流。因此,BufferedInputStream 将关闭操作转发到包装的 InputStream 上,然后输入流将释放其资源。


推荐