Java 在没有try/catch块的情况下关闭InputStream?
我知道应该关闭Java 在没有try/catch块的情况下关闭InputStream?,java,inputstream,Java,Inputstream,我知道应该关闭InputStream。但我有一些疑问,在哪里以及如何做到这一点 根据以下文件: 无条件关闭输入流。相当于 InputStream.close(),但将忽略任何异常这是 通常用于finally块 我的代码中不需要try/catch块,因此我没有finally块。在使用下面的方法返回InputStream之前,关闭InputStream可以吗?或者我应该做些不同的事情吗?多个服务将使用此方法从文件加载InputStream public InputStream read(String
InputStream
。但我有一些疑问,在哪里以及如何做到这一点
根据以下文件:
无条件关闭输入流。相当于
InputStream.close(),但将忽略任何异常这是
通常用于finally块
我的代码中不需要try/catch
块,因此我没有finally
块。在使用下面的方法返回InputStream之前,关闭InputStream可以吗?或者我应该做些不同的事情吗?多个服务将使用此方法从文件加载InputStream
public InputStream read(String filename) {
InputStream inputStream = Thread.currentThread().getContextClassLoader().getResourceAsStream(filename);
if (inputStream == null) {
// Throw some exception
}
IOUtils.closeQuietly(inputStream);
return inputStream;
}
您不应该安静地调用
IOUtils.closes(inputStream)在这个方法中,返回一个关闭的流几乎没有意义
但是,应在try/finally块中调用此方法:
InputStream is = null;
try {
is = read(filename);
// Do whatever with is.
} finally {
IOUtils.closeQuietly(is);
}
或者使用try with resources(注意“try with resources语句将消除大多数使用IOUtils.closequilly
”的需要):
try/finally块:
InputStream is = null;
try {
is = read(filename);
// Do whatever with is.
} finally {
IOUtils.closeQuietly(is);
}
InputStream=null;
试一试{
输入流是=
is=读取(文件名);
//用它做任何事。
}最后{
is.close();
}
注意:所有i/o资源都需要在finally块中关闭,因为它是在try-catch块中初始化的。此外,建议加入:
} catch(IOException e){
e.printstacktrace();
}
…对于异常处理查看您的方法,它不应该是关闭InputStream
的方法。让调用者适当地关闭它。为什么返回的是InputStream
,而不是文件的内容?@ndrone因为还有其他逻辑需要文件作为InputStream
。但这与imo的问题无关。我想我只是想了解封闭的InputSteam
对于其他逻辑有什么好处。但您似乎找到了答案我有多个服务需要从文件中读取InputStream
,而文件又需要使用ObjectMapper
映射到一些对象。我想要分离关注点(从文件读取,映射到对象),并且我想要重用逻辑。我可以使用一个抽象的父类,静态实用程序类。我的观点是,我的read方法在任何时候都不会抛出异常,所以我不需要try/catch。所以我没有最后一个街区。我还应该用try/finally来包围它吗?“我的read方法在任何时候都不会抛出异常”当然,也许,现在。如果你改变方法怎么办?这只是消除不关闭流的可能性的最佳实践。感谢这里的有用提示。我将重构我的代码以使其更好。还忘了--is.flush();