Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java FileDescriptor什么时候关闭?_Java_Android_File Descriptor_Fileinputstream - Fatal编程技术网

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)所暗示的。