2016-04-25 68 views
1

我知道InputStream应该关闭。但我有些怀疑在哪里以及如何做到这一点。没有try/catch块关闭InputStream?

据对IOUtils.closeQuietly文档:

无条件关闭的InputStream。相当于 InputStream.close(),除了任何异常将被忽略。 这是 通常用于最后的块

我的代码中不需要try/catch块,所以我没有finally块。在我的方法中返回它之前关闭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; 
} 
+0

看你的方法,它不应该是一个关闭'InputStream'。让调用者关闭它。 – Tunaki

+0

你为什么要返回'InputStream'而不是文件的内容? – ndrone

+0

@ndrone因为还有其他的逻辑需要文件作为'InputStream'。但这与imo问题无关。 – Diyarbakir

回答

7

你不应该叫IOUtils.closeQuietly(inputStream);在所有在此方法 - 有在返回一个封闭的流很少的一点。

然而,这种方法应该在try/finally块被称为:

InputStream is = null; 
try { 
    is = read(filename); 
    // Do whatever with is. 
} finally { 
    IOUtils.closeQuietly(is); 
} 

或者try-与资源(注意注释here说:“尝试 - 与资源语句将消除大多数需要使用IOUtils.closeQuietly“):

try (InputStream is = read(filename)) { 
    // Do whatever with is. 
} 
+0

我有多个服务需要从文件中读取一个'InputStream',而这个文件又需要使用'ObjectMapper'映射到某个'Object'。我想分离问题(从文件读取,映射到对象),我想重用逻辑。我可以使用Abstract父类,静态Utility类。我的观点是我的阅读方法并没有在任何时候抛出Exception,所以我不需要try/catch。所以我没有最后一块。我应该还是试试/最后才围绕它? – Diyarbakir

+0

“我的阅读方法并没有在任何时候抛出异常”当然,也许,现在。如果你改变方法怎么办?这是删除不关闭流的可能性的最佳做法。 –

+0

感谢这里的有用提示。我会重构我的代码以使其更好。 – Diyarbakir

0

try/finally块:

InputStream is = null; 尝试InputStream = is = read(filename); //做任何事情。 } finally { is.close(); }

注意:所有的I/O资源都需要在finally块中关闭,因为它是在try-catch块中初始化的。此外,还建议补充:

} catch(IOException e){ 
    e.printstacktrace(); 
} 

...异常处理

+0

也忘了--- is.flush(); –