我的应用需要执行以下操作:
- 打开一个
FileInputStream
,获取底层FileDescriptor
(通过getFd()
) - 基于上述
FileDescriptor
创建新的FileInputStream
对象
到目前为止,我只需要一个FileDescriptor
,所以我习惯于通过在原始流上调用close()
来关闭它(即在我调用getFd()
的流上)。我使用它是因为一些Android API方法有这样的参数。
既然我将同时拥有更多的FileInputStream
对象,那么FileDescriptor
何时关闭呢?(我的猜测是:当所有FileInputStream
对象都关闭时?)
2条答案
按热度按时间rdlzhqv91#
我相信你是对的,一个小测试表明
FileDescriptor
在它的FileInputStream
关闭后就失效了,注意,如果同一个FileDescriptor
有多个FileInputStream
,那么FileDescriptor
在它的第一个FileInputStream
关闭后就失效了。也就是说,先关闭fis1
,然后关闭fis2
,或者反过来关闭都没有关系:输出为:
不要忘记关闭
finally
块中的流,以确保在出现I/O(读/写)错误时也关闭它。afdcj2ne2#
Android
FileInputStream
有fd所有权的概念。从文件创建流时isFdOwner为true。从现有
FileDescriptor
创建流时为false。(实际上,有一个隐藏的构造函数允许您指定新流是否也是所有者,但“false”在几乎所有情况下都很有效)如果关闭用
File
-打开的FileInputStream
,它将被关闭。关闭用fd -打开的流将不执行任何操作。