关闭Java FileInputStream

Mat*_*t H 32 java exception stream

好吧,我一直在做以下(变量名已被更改):


FileInputStream fis = null;
try
{
    fis = new FileInputStream(file);

    ... process ...

}
catch (IOException e)
{
    ... handle error ...
}
finally
{
    if (fis != null)
        fis.close();
}

最近,我开始使用FindBugs,这表明我没有正确关闭流.我决定看看是否有任何可以用finally {}块做的事情,然后我看,哦是的,close()可以抛出IOException.人们应该在这做什么?Java库会抛出太多已检查的异常.

McD*_*ell 44

对于Java 7及更高版本,应使用try-with-resources:

try (InputStream in = new FileInputStream(file)) {
  // TODO: work
} catch (IOException e) {
  // TODO: handle error
}
Run Code Online (Sandbox Code Playgroud)

如果你坚持使用Java 6或更低版本......

这种模式避免了使用null进行乱码:

    try {
        InputStream in = new FileInputStream(file);
        try {
            // TODO: work
        } finally {
            in.close();
        }
    } catch (IOException e) {
        // TODO: error handling
    }
Run Code Online (Sandbox Code Playgroud)

有关如何有效处理close的更多细节,请阅读此博文:Java:如何不弄乱流处理.它有更多的样本代码,更深入,覆盖包装的陷阱密切捕捉块.


Max*_*art 26

类似下面的内容应该这样做,取决于您是否在尝试关闭流时抛出或吞下IOException.

FileInputStream fis = null;
try
{
    fis = new FileInputStream(file);

    ... process ...


}
catch (IOException e)
{
    ... blah blah blah ...
}
finally
{
    try
    {
        if (fis != null)
            fis.close();
    }
    catch (IOException e)
    {
    }
}
Run Code Online (Sandbox Code Playgroud)


Edw*_*rzo 10

您可以使用添加了JDK7 的try-with-resources功能.它的创建恰恰是为了处理这类事情

static String readFirstLineFromFile(String path) throws IOException {
  try (BufferedReader br = new BufferedReader(new FileReader(path))) {
    return br.readLine();
  }
}
Run Code Online (Sandbox Code Playgroud)

该文件说:

try-with-resources语句确保在语句结束时关闭每个资源.