在 Java 中使用流时如何修复 'Stream closed' 错误
How to fix 'Stream closed' error while using Streams in Java
问题是:
当我在下面的代码中 运行 声纳检查(分析我的代码中的错误)时,它抱怨 ClassA -> createFile() 中的 FileInputStream 未关闭。
我知道这是资源泄漏,需要关闭。但是,如果我使用 try with resources 或在 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) 在此处创建,在此处关闭:使用 try-with-resources 结构。
2) 你将资源传递给一个对象,然后那个对象本身就是一个可关闭的资源;当该资源关闭时,它会关闭其中的资源。
3) 奇怪的东西,不推荐,sonar 之类的 linters 会将其标记为有问题,难以调试等
当然,您应该尽可能避免#3。
在这里,您似乎有 2 个可行的选择:
使 ClassB 实现 AutoClosable 并让它在其关闭方法中关闭该输入流,或者
不是传递输入流,而是传递一个可以从中派生输入流的东西,这样使用它的 ClassB 的代码就可以做 try-with-resources 的事情。据推测,您可能会传递 Path 或 File 对象而不是 InputStream。
问题是: 当我在下面的代码中 运行 声纳检查(分析我的代码中的错误)时,它抱怨 ClassA -> createFile() 中的 FileInputStream 未关闭。 我知道这是资源泄漏,需要关闭。但是,如果我使用 try with resources 或在 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) 在此处创建,在此处关闭:使用 try-with-resources 结构。
2) 你将资源传递给一个对象,然后那个对象本身就是一个可关闭的资源;当该资源关闭时,它会关闭其中的资源。
3) 奇怪的东西,不推荐,sonar 之类的 linters 会将其标记为有问题,难以调试等
当然,您应该尽可能避免#3。
在这里,您似乎有 2 个可行的选择:
使 ClassB 实现 AutoClosable 并让它在其关闭方法中关闭该输入流,或者
不是传递输入流,而是传递一个可以从中派生输入流的东西,这样使用它的 ClassB 的代码就可以做 try-with-resources 的事情。据推测,您可能会传递 Path 或 File 对象而不是 InputStream。