【发布时间】:2014-07-22 13:15:37
【问题描述】:
以下两个选项在语义上有区别吗?在自动资源管理方面,它们中的任何一个都比另一个更安全吗?
选项1:
try ( ObjectInputStream in = new ObjectInputStream(new
FileInputStream("fooFile")) ) {
...
}
选项2:
try (FileInputStream fin = new FileInputStream("fooFile");
ObjectInputStream in = new ObjectInputStream(fin)) {
...
}
【问题讨论】:
-
我不确定,但我认为在第二个示例中,两个流分别关闭,如果
ObjectInputStream缓存一些数据并且FileInputStream先关闭,这可能会出现问题。跨度> -
@isnot2bad 他们总是保证以相反的顺序关闭。所以在我上面的代码中
in将首先关闭,然后只有fin将被关闭。所以你的观点没有实际意义。 -
唯一的区别是你会在
fin上得到一个多余的close调用,但根据AutoCloseable合约,这不会导致任何错误。 -
很简单,
fin被声明为托管资源,因此它自然会调用其close方法。这将是多余的,因为此时它已经关闭(in.close()已在内部级联到fin.close())。 -
stackoverflow.com/a/21348893/1419315 存在的论点本质上是,对于第一个变体,
FileInputStream.close ()在ObjectInputStream的构造 失败时不会被调用。
标签: java file-io java-7 try-with-resources