2

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

  • 打开 a FileInputStream,获取底层证券FileDescriptor(通过getFd()
  • FileInputStream根据上述创建新对象FileDescriptor

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

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

4

1 回答 1

4

我相信你是对的。一个小测试表明它在关闭FileDescriptor后变得无效。FileInputStream请注意,如果有多个FileInputStream相同FileDescriptor的 ,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(读/写)错误的情况下也关闭它。

于 2013-06-23T17:36:11.000 回答