在 Java 中使用流时如何修复 'Stream closed' 错误

How to fix 'Stream closed' error while using Streams in Java

问题是: 当我在下面的代码中 运行 声纳检查(分析我的代码中的错误)时,它抱怨 ClassA -> createFile() 中的 FileInputStream 未关闭。 我知道这是资源泄漏,需要关闭。但是,如果我使用 try with resources 或在 finally 块中关闭流, ClassB 抱怨它在关闭时无法读取流。

解决此问题的最佳方法是什么?

代码块:

public ClassA{
    public ClassB createFile(){
        return new ClassB(new FileInputStream(new File("filePath")), revision, .. other arguments);
    }
}

public ClassB{
    public ClassB(InputStream fileInputStream, String revision, other arguments){
        // save the arguments in class variables. Do something with stream
    }
}

对于资源(您需要关闭的东西),您有三个选项:

1) 在此处创建,在此处关闭:使用 try-with-resources 结构。

2) 你将资源传递给一个对象,然后那个对象本身就是一个可关闭的资源;当该资源关闭时,它会关闭其中的资源。

3) 奇怪的东西,不推荐,sonar 之类的 linters 会将其标记为有问题,难以调试等

当然,您应该尽可能避免#3。

在这里,您似乎有 2 个可行的选择:

  1. 使 ClassB 实现 AutoClosable 并让它在其关闭方法中关闭该输入流,或者

  2. 不是传递输入流,而是传递一个可以从中派生输入流的东西,这样使用它的 ClassB 的代码就可以做 try-with-resources 的事情。据推测,您可能会传递 Path 或 File 对象而不是 InputStream。