有没有办法在Java中同时关闭所有流或句柄而不引用它们?或者有没有办法关闭与在Java中引用该文件的特定文件相关联的所有句柄(流)?
答案 0 :(得分:2)
如果没有对流的引用,则无法在其上调用close()
,与任何其他对象相同 - 如果没有引用它,您实际上无法对其执行任何操作。我不完全确定如何在内部处理流,并且说实话,可能有一种方法可以使用内部或反射或JNI来实现,但如果存在更好的解决方案,通常应该避免所有这些。
相反,您应该查看程序/代码的设计,并尝试将其重新设计为:
close()
使用后立即流,或如果您使用的API没有为您提供对该流的引用,并且没有close()
该流,并且您无法close()
该流,那么是您正在使用的API中的错误/设计缺陷。
如果您在某个时刻引用了一个流,但丢失了该引用并需要稍后关闭它,那么您可以简单地设置某种注册表来维护流列表。极端简单的例子是这样的:
public class StreamRegistry {
private List<Closeable> streams = new ArrayList<>();
public void register(Closeable closeable) {
streams.add(closeable);
}
public void close() throws IOException {
for(Closeable closeable : streams) {
closeable.close();
}
}
}
虽然你可能希望从IOException
抓住close()
,但要记录它,然后继续尝试关闭流。
但是,除非绝对必要,否则我不建议使用注册表。正如@EJP和@Suresh Atta在对你的问题的评论中所说,如果你提出这样的问题,你可能应该尝试重构/重新设计你的代码以完全避免这个问题并尝试和close()
流一旦你完成了它们。也就是说,在不知道你为什么要这么做的情况下,除了提出选择之外我什么也做不了。
答案 1 :(得分:1)
最好的方法是使用一些静态代码分析工具,如声纳。它将告诉您错过哪些地方关闭开放流。如果您忘记打开任何流,它会告诉您存在需要修复的阻止程序问题。
有关声纳的更多详细信息,您可以使用给定的链接。