问题是: 当我在下面的代码上运行声纳检查(分析我的代码中的错误)时,它抱怨 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 个可行的选择:
使 ClassB 实现 AutoClosable 并让它在其 close 方法中关闭该输入流,或者
而不是传递一个输入流,而是传递一个可以从中派生输入流的东西,以便使用它的 ClassB 的代码可以做 try-with-resources 的事情。据推测,您可能会传递 Path 或 File 对象而不是 InputStream。
添加回答
举报
0/150
提交
取消