如何在 Java 中使用 Streams 时修复“Stream closed”错误

问题是: 当我在下面的代码上运行声纳检查(分析我的代码中的错误)时,它抱怨 ClassA 中的 FileInputStream -> createFile() 没有关闭。我了解这是资源泄漏,需要关闭。但是,如果我对资源使用 try 或在 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

    }

}


芜湖不芜
浏览 123回答 1
1回答

精慕HU

对于资源(您需要关闭的东西),您可以获得三个选项:1) 你在这里创建它,你在这里关闭它:使用 try-with-resources 构造。2)你将资源传递给一个对象,然后那个对象本身就是一个可关闭的资源;当该资源关闭时,它会关闭其中的资源。3)奇怪的东西,不推荐,像声纳这样的短绒将标记为有问题,难以调试等。当然,您应该尽可能避免#3。在这里,您似乎有 2 个可行的选择:使 ClassB 实现 AutoClosable 并让它在其 close 方法中关闭该输入流,或者而不是传递一个输入流,而是传递一个可以从中派生输入流的东西,以便使用它的 ClassB 的代码可以做 try-with-resources 的事情。据推测,您可能会传递 Path 或 File 对象而不是 InputStream。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java