问题是: 当我对以下代码运行声纳检查(以分析我的代码中的错误)时,它抱怨ClassA中的FileInputStream-> createFile()未关闭。 我了解这是资源泄漏,需要关闭。但是,如果我尝试使用资源或在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
}
}
答案 0 :(得分:1)
对于资源(您需要关闭的内容),您有三个选择:
1)您在此处创建它,然后在此处关闭它:使用try-with-resources构造。
2)您将资源传递给对象,然后该对象本身就是可关闭的资源;当该资源关闭时,它也会关闭其中的资源。
3)不推荐使用奇怪的东西,诸如声纳之类的短绒棉将其标记为有问题,难以调试等。
自然,您应该尽可能避免#3。
在这里,您似乎有两个可行的选择:
使ClassB实现AutoClosable,并使其以其close方法关闭该输入流,或者
不是传递输入流,而是传递可以从中派生输入流的thingie,以便使用它的ClassB代码可以执行try-with-resources事情。大概,您可能传递了Path或File对象,而不是InputStream。