在Java中关闭输出流的正确方法?

在Java中关闭输出流的正确方法?,java,Java,这似乎很愚蠢,但关闭输出流时,最可靠的模式是什么?现在,我有一些类似于以下的东西,它们似乎是“尝试-捕获-最终过度杀戮”: private void writeContentsToFile(OutputStream ostream, Properties contents) { try { contents.store(ostream, "comments"); } catch (IOException e) { throw new Res

这似乎很愚蠢,但关闭输出流时,最可靠的模式是什么?现在,我有一些类似于以下的东西,它们似乎是“尝试-捕获-最终过度杀戮”:

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抛出选中的异常对我来说仍然是个谜。我可以创建执行close/catch块的包装器方法,但是如果已经存在类似
FileUtil.closefileandrowuncheckedexception()的内容,我会使用它。当你有很多小项目和很多开发人员时,这会变得更加有用;一种正确的方法。

如果您使用的是ApacheCommons,那么IOUtils.closequity()会很好地完成这项工作。看

我认为你的方式是最好的方式。如果close抛出了一个异常,那么您确实无法对此采取任何措施。这可能会抛出捕获的异常,因为它可能不好,这取决于它的使用方式。如果你真的需要关闭一个文件,你想强制它。如果您只是想使用close进行错误处理,那么应该忽略异常。

我认为不应该忽略异常。来电者被误导,认为内容编写成功。异常应该向上传播


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

close()可能会写入数据。例如,如果底层流缓冲数据,close()将刷新数据,这可能与写入调用失败的原因相同(在例如套接字的情况下,close()可能也会发出先前写入调用失败的信号),请考虑使用Writer,而不是直接处理流。如果您使用一个适合任务的编写器,编写器将提供很多便利。例如,当使用
BufferedWriter
存储属性时,将是一个不错的选择。如果您查看源代码,您将看到它刷新并关闭流,尽管您仍然需要处理“额外”IOException。@Paul:我通常会这样做,但我在这种情况下使用OutputStream只是作为一个简单的示例。在上一次捕获中,您可以
抛出新的RuntimeException(e)
。它是未选中的,您不会隐藏异常。@Raedwald,我已将此问题标记为重新打开。虽然它确实是一个复制品,但它现在是谷歌上最明显的搜索结果(我不会在这里添加搜索词,否则会增强效果)。答案显然也过时了。我认为这个问题应该重新开始,并公布正确答案。我怎么会错过这个?我想我已经查过了。我会给这个问题一些时间来获得更多的反馈,但这看起来很合适。当我以前实现这个问题时,我通常会用RuntimeException包装IOException并再次抛出它,但CloseAnquity实际上是在吞下异常。哪个更好?