问题是:当我在以下代码上运行声纳检查(分析我的错误代码)时,它会抱怨classa-> createfile()中的fileInputStream并未关闭。我了解这是一种资源泄漏,需要关闭。但是,如果我使用资源尝试或关闭流中的流,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-with-resources构造。
2)您将资源传递给对象,然后该对象本身就是可关闭的资源;关闭该资源时,它关闭了其中的资源。
3)奇怪的东西,不推荐,诸如Sonar之类的衬里会标记为有问题,难以调试等等。
自然,您应该尽可能避免#3。
在这里,看起来您有2个可行的选项:
-
使classB实现自动固有性,并在其关闭方法或
中关闭该输入 ,而不是传递一个可以从中派生输入流的东西,以便使用它的classB代码可以完成try-with-resources事情。据推测,您可能会通过路径或文件对象而不是输入式。