FileDescriptor什么时候关闭?

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

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

到目前为止,我只需要一个FileDescriptor ,所以我曾经通过在原始流上调用close()来关闭它(即在我调用的getFd()流上)。 我使用它是因为一些Android API方法有这样的参数。

现在我将同时拥有更多的FileInputStream对象, FileDescriptor何时关闭? (我猜:当所有FileInputStream对象都关闭?)

我相信你是对的。 一个小测试显示FileDescriptor在其FileInputStream关闭后变为无效。 请注意,如果同一个FileDescriptor有多个FileInputStream ,则FileDescriptor会在其第一个FileInputStream关闭时变为无效,即,如果先关闭fis1然后关闭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(读/写)错误的情况下也关闭它。