Java FileDescriptor什么时候关闭?
我的应用程序需要执行以下操作:Java FileDescriptor什么时候关闭?,java,android,file-descriptor,fileinputstream,Java,Android,File Descriptor,Fileinputstream,我的应用程序需要执行以下操作: 打开一个FileInputStream,获取底层FileDescriptor(通过getFd()) 基于上述文件描述符创建新的FileInputStream对象 到目前为止,我只需要一个FileDescriptor,所以我习惯于在原始流(即我调用的getFd()流)上调用close()来关闭它。我之所以使用它,是因为有些Android API方法有这样一个参数 既然我将同时拥有更多的FileInputStream对象,那么FileDescriptor何时关闭?
- 打开一个
,获取底层FileInputStream
(通过FileDescriptor
)getFd()
- 基于上述文件描述符创建新的
对象FileInputStream
FileDescriptor
,所以我习惯于在原始流(即我调用的getFd()
流)上调用close()
来关闭它。我之所以使用它,是因为有些Android API方法有这样一个参数
既然我将同时拥有更多的
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
块中关闭流,以确保在出现I/O(读/写)错误时也将其关闭。这似乎是可以测试的东西?你是对的,我最初不知道如何检测它是否已关闭,但现在我可以想出一些办法,Jiri Patera在回答中也给出了一个选项。谢谢,这回答了我问题的一部分。还有一个问题是,如果基于fd创建更多FileInputStream对象,fd什么时候会变得无效?基于我刚刚检查过的Android源代码,我有一个有趣的怀疑,但如果你能先测试一下(现在你已经设置好了环境),那就太好了。顺便说一下,我基于Android源代码的“有趣怀疑”:基于fd创建的FileInputStream对象在关闭时不会触及它;当原始FileInputStream关闭时,fd将关闭(不考虑任何其他打开的FileInputStream实例)。至少,这是Androud源代码(v2.2)所暗示的。