【问题标题】:Closing streams on exception - OK to assume where exceptions can happen?关闭异常流 - 可以假设异常发生在哪里?
【发布时间】:2012-07-06 19:41:22
【问题描述】:

这更像是一个风格和挑剔的问题,但我很好奇对此的看法。考虑下面的代码(忽略我可以使用不同的函数来避免这个问题):

FileUtils.copyInputStreamToFile(new FileInputStream(f1), f2);

copyInputStreamToFile 来自 apache.commons.io 并将关闭流。我认为这应该在所有常见情况下关闭 InputStream,因为如果在创建 InputStream 时发生异常,则没有什么可关闭的,如果在 copyInputStreamToFile 内部发生异常,那么此函数将为我关闭流。

但是,假设在InputStream 的创建和copyInputStreamToFile 中try-block 的开始之间没有异常或错误真的安全吗?我正在考虑不寻常的事情,例如OutOfMemoryErrorThreadDeath。所以,我们可以将上面的代码改写为:

InputStream is = null;
try {
    is = new FileInputStream(f1);
    FileUtils.copyInputStreamToFile(is, f2);
} finally {
    IOUtils.closeQuietly(is);
}

这应该是安全的,但你认为有必要吗?

【问题讨论】:

  • 没有解决方案有助于对抗ThreadDeath,OOME 也不会突然发生——它只能从请求内存分配的代码中抛出。

标签: java exception-handling io


【解决方案1】:

我认为这取决于您的应用程序是否并发。如果是,您不能假设在 InputStream 的创建和 copyInputStreamToFile 的主体之间没有其他代码会运行。

Marko Topolnik回答了应用程序不并发的情况。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多