我刚刚在查看FileInputStream的实现时,对其close方法的实现感到困惑,如下所示:
public void close() throws IOException {
synchronized (closeLock) {
if (closed) {
return;
}
closed = true;
}
if (channel != null) {
channel.close();
}
fd.closeAll(new Closeable() {
public void More ...close() throws IOException {
close0();
}
});
}
这将在FileDescriptor上内部调用closeAll
,它会释放所有可关闭的资源(不仅是调用 close 的特定实例)。因此,对输入流的关闭会关闭该文件描述符共享的所有流。
FileInputStream is = new FileInputStream("Some file");
BufferedInputStream br = new BufferedInputStream(is);
FileDescriptor fd = is.getFD();
FileInputStream is1 = new FileInputStream(fd);
BufferedInputStream br1 = new BufferedInputStream(is1);
is.close();
System.out.println(is1.read());
在上面的示例中,
FileDescriptor
fd
在流is
和is1
之间共享。对is
进行关闭调用时,is1
也会被关闭(基本上是关闭/释放fd
)。我的问题是,FileInputStream有一个标志来表示它是否关闭,但为什么当其他活动流指向它时,它会关闭FileDescriptor,从而使它们全部失败/无效,而不仅仅是关闭调用实例,并在没有其他流指向它时关闭FileDescriptor?
FileDescriptor
不应该像您现在使用它们一样被重复使用。 - Louis Wasserman