FileDescriptor何时关闭



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

  • 打开一个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-打开的流不会有任何作用。

相关内容

  • 没有找到相关文章

最新更新