android FileDescriptor何时关闭?

vcudknz3  于 2023-02-02  发布在  Android
关注(0)|答案(2)|浏览(145)

我的应用需要执行以下操作:

  • 打开一个FileInputStream,获取底层FileDescriptor(通过getFd()
  • 基于上述FileDescriptor创建新的FileInputStream对象

到目前为止,我只需要一个FileDescriptor,所以我习惯于通过在原始流上调用close()来关闭它(即在我调用getFd()的流上)。我使用它是因为一些Android API方法有这样的参数。
既然我将同时拥有更多的FileInputStream对象,那么FileDescriptor何时关闭呢?(我的猜测是:当所有FileInputStream对象都关闭时?)

rdlzhqv9

rdlzhqv91#

我相信你是对的,一个小测试表明FileDescriptor在它的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(读/写)错误时也关闭它。

afdcj2ne

afdcj2ne2#

Android FileInputStream有fd所有权的概念。
从文件创建流时isFdOwner为true。从现有FileDescriptor创建流时为false。(实际上,有一个隐藏的构造函数允许您指定新流是否也是所有者,但“false”在几乎所有情况下都很有效)
如果关闭用File-打开的FileInputStream,它将被关闭。关闭用fd -打开的流将不执行任何操作。

相关问题