gpt4 book ai didi

java - 为什么关闭输入流也会关闭关联的文件描述符,即使文件描述符在多个流之间共享?

转载 作者:行者123 更新时间:2023-11-30 10:50:42 24 4
gpt4 key购买 nike

我刚刚经历了 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 ,释放所有 Closables(不仅是调用关闭的特定实例)。因此,对输入流的关闭调用将关闭所有共享该 FileDescriptor 的流。

    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 在流 isis1 之间共享。对 is 的关闭调用也会关闭 is1(基本上 fd 已关闭/释放)

我的问题是,FileInputStream 有一个标志来指示它是否关闭,但仍然为什么它在其他 Activity 流指向它时关闭 FileDescriptor,使它们全部失败/无效,而不是仅仅关闭调用实例和当没有其他流指向它时关闭 FileDescriptor?

最佳答案

如果您从 File 对象而不是 FileDescriptor 打开 FileInputStreams,您将获得预期的行为:

File f = new File( ... );
InputStream in1 = new FileInputStream( f );
InputStream in2 = new FileInputStream( f );

您会在 FileInputStream( File ) 中看到构造函数源,这为每个 FileInputStream 创建一个新的 FileDescriptor,而不是像 FileInputStream( FileDescriptor ) 中那样共享传入的一个。构造函数。

来自javadoc , FileDescriptor 包装代表打开文件句柄的底层 native 操作系统结构。

InputStream.close() 的全部目的是清理那些 native 资源。因此,如果两个 InputStreams 共享 native 文件句柄,则当其中一个关闭时,另一个也会受到影响。

在我上面提供的替代示例中,在操作系统/ native 级别创建了两个独立的文件句柄,因此它们可以独立关闭。

关于java - 为什么关闭输入流也会关闭关联的文件描述符,即使文件描述符在多个流之间共享?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34980241/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com