我的应用程序需要执行以下操作:
- 打开一个
FileInputStream
,获取底层FileDescriptor
(通过getFd()
) - 基于上述
FileDescriptor
创建新的FileInputStream
对象
到目前为止,我只需要一个FileDescriptor
,所以我过去常常通过在原始流(即我调用的getFd()
的流)上调用close()
来关闭它。我使用它是因为一些安卓API方法有这样一个参数。
既然我将同时拥有更多的FileInputStream
对象,FileDescriptor
什么时候关闭?(我的猜测是:当所有FileInputStream
对象都关闭时?)
FileDescriptor
在其FileInputStream
关闭后变为无效。请注意,如果同一个FileDescriptor
有多个FileInputStream
,则一旦其第一个FileInputStream
关闭,FileDescriptor
就会变为无效,也就是说,无论您是先关闭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(读/写)错误时也关闭它。
Android FileInputStream
有一个fd所有权的概念。
当您从File创建流时,isFdOwner为true。当您从现有的FileDescriptor
创建它时,它是假的吗。(实际上有一个隐藏的构造函数,它允许您指定无论新流是否也是所有者,但"假"在几乎所有情况下都很有效)
如果关闭用File
打开的FileInputStream
,它将被关闭。关闭用fd-打开的流不会有任何作用。