为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

芜湖不芜 2022-06-23 10:23:53
问题是: 当我在下面的代码上运行声纳检查(分析我的代码中的错误)时,它抱怨 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    }}
查看完整描述

1 回答

?
精慕HU

TA贡献1845条经验 获得超8个赞

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

1) 你在这里创建它,你在这里关闭它:使用 try-with-resources 构造。

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

3)奇怪的东西,不推荐,像声纳这样的短绒将标记为有问题,难以调试等。

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

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

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

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


查看完整回答
反对 回复 2022-06-23
  • 1 回答
  • 0 关注
  • 122 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信