在Java中关闭OutputStream的正确方法?

时间:2011-06-07 17:17:44

标签: java

这几乎看起来很傻但是关闭OutputStream时最可靠的模式是什么?现在我有类似下面的东西,似乎是try-catch-finally-overkill:

private void writeContentsToFile(OutputStream ostream, Properties contents) {
    try {
        contents.store(ostream, "comments");
    }
    catch (IOException e) {
        throw new ResourceException("Failed to write contents", e);
    }
    finally {
        try {
            ostream.close();
        }
        catch (IOException e) { /* what can be done here anyway? */ }
    }
}

为什么关闭抛出已检查的异常对我来说仍然是一个谜。我可以创建执行close / catch块的包装器方法,但是如果有像FileUtil.closeFileAndThrowUncheckedException()这样的东西我想使用它。当你有很多具有大量开发人员的小项目时,这会变得更有用;一种方法是正确的。

3 个答案:

答案 0 :(得分:18)

如果您使用的是Apache Commons,那么IOUtils.closeQuietly()可以很好地完成工作。见http://commons.apache.org/proper/commons-io/javadocs/api-1.4/org/apache/commons/io/IOUtils.html#closeQuietly(java.io.OutputStream)

答案 1 :(得分:1)

我不认为应该吞下这个例外。调用者被误导相信内容已成功写入。异常应该向上传播。

如果您不喜欢已检查的异常(特别是对于此类低级别错误),请将其包装为未选中状态。或者你可以遵循Java的约定,无论好坏,并在你的方法上声明IOException。

答案 2 :(得分:0)

我认为你的方式是'最好'的方式。如果close抛出异常,你确实无法做任何事情。这可能会引发一个被捕获的异常,因为它可能很糟糕,具体取决于它的使用方式。如果你真的需要关闭一个文件,你想强制执行它。如果你只想使用close来进行错误处理,你应该忽略异常。

相关问题