我的应用需要执行以下操作:
FileInputStream
,获取基础FileDescriptor
(通过getFd()
)FileInputStream
FileDescriptor
个对象
到目前为止,我只需要一个FileDescriptor
,所以我以前通过在原始流上调用close()
来关闭它(即在getFd()
我调用的流上)。我使用它是因为一些Android API方法有这样的参数。
现在我将同时拥有更多FileInputStream
个对象,FileDescriptor
什么时候会被关闭? (我的猜测:所有FileInputStream
个对象都关闭了吗?)
答案 0 :(得分:3)
我相信你是对的。小测试显示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
不要忘记关闭{{1}}块中的流,以确保在发生I / O(读/写)错误时也将其关闭。