立即关闭Java中的所有流

时间:2017-07-19 12:30:08

标签: java file stream handles

有没有办法在Java中同时关闭所有流或句柄而不引用它们?或者有没有办法关闭与在Java中引用该文件的特定文件相关联的所有句柄(流)?

2 个答案:

答案 0 :(得分:2)

如果没有对流的引用,则无法在其上调用close(),与任何其他对象相同 - 如果没有引用它,您实际上无法对其执行任何操作。我不完全确定如何在内部处理流,并且说实话,可能有一种方法可以使用内部或反射或JNI来实现,但如果存在更好的解决方案,通常应该避免所有这些。

相反,您应该查看程序/代码的设计,并尝试将其重新设计为:

  1. close()使用后立即流,或
  2. 自己维护一个开放流列表
  3. 如果您使用的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)

最好的方法是使用一些静态代码分析工具,如声纳。它将告诉您错过哪些地方关闭开放流。如果您忘记打开任何流,它会告诉您存在需要修复的阻止程序问题。

有关声纳的更多详细信息,您可以使用给定的链接。

Sonar Qube