FileDescriptor什么时候关闭?
我的应用需要执行以下操作:
- 打开
FileInputStream
,获取底层的FileDescriptor
(通过getFd()
) - 基于上面的
FileDescriptor
创建新的FileInputStream
对象
到目前为止,我只需要一个FileDescriptor
,所以我曾经通过在原始流上调用close()
来关闭它(即在我调用的getFd()
流上)。 我使用它是因为一些Android API方法有这样的参数。
现在我将同时拥有更多的FileInputStream
对象, FileDescriptor
何时关闭? (我猜:当所有FileInputStream
对象都关闭?)
我相信你是对的。 一个小测试显示FileDescriptor
在其FileInputStream
关闭后变为无效。 请注意,如果同一个FileDescriptor
有多个FileInputStream
,则FileDescriptor
会在其第一个FileInputStream
关闭时变为无效,即,如果先关闭fis1
然后关闭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
块中关闭流,以确保在I / O(读/写)错误的情况下也关闭它。