我的应用程序需要执行以下操作:
- 打开
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/