java - FileDescriptor什么时候关闭?

标签 java android file-descriptor fileinputstream

我的应用程序需要执行以下操作:

  • 打开FileInputStream,并获取底层FileDescriptor(通过getFd())
  • 根据上面的FileDescriptor创建新的FileInputStream对象

到目前为止,我只需要一个 FileDescriptor,因此我过去常常通过在原始流上调用 close() 来关闭它(即在 getFd() 我调用了)。我使用它是因为一些Android API方法有这样的参数。

现在我将同时拥有更多 FileInputStream 对象,那么 FileDescriptor 何时关闭? (我的猜测:当所有 FileInputStream 对象都关闭时?)

最佳答案

我相信你是对的。一个小测试表明,FileDescriptor 在其 FileInputStream 关闭后变得无效。请注意,如果同一 FileDescriptor 有多个 FileInputStream,则该 FileDescriptor 一旦第一个 FileInputStream 已关闭,即先关闭 fis1 再关闭 fis2 或反之亦然:

FileInputStream fis1 = new FileInputStream("/tmp/adb.log");
FileDescriptor fd = fis1.getFD();
FileInputStream fis2 = new FileInputStream(fd);
System.out.println(fd.valid());
fis1.close();
System.out.println(fd.valid());
fis2.close();
System.out.println(fd.valid());

输出是:

true
false
false

不要忘记在 finally block 中关闭流,以确保在发生 I/O(读/写)错误时也将其关闭。

关于java - FileDescriptor什么时候关闭?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17263278/

相关文章:

java - SecondarySort -OverrideError(删除注释)

android - 编辑文本行号和当前行光标位置。

javascript - 如何使用 react-native 生成​​可以在没有服务器的情况下运行的 apk?

c - 查找与文件名关联的目录的文件描述符

java - Java Swing JScrollBar 何时更新其大小?

java - 在 Eclipse 中拼错方法名称后如何恢复自动完成?

java - Map 和 Groupby 合二为一

android - 在所有元素加载后启动 Activity

apache - 套接字 : Too many open files (24) apache bench lighttpd

c++ - 尽管多线程 web 应用程序有很高的限制,但 mmaped 文件的文件描述符用完了