如何声明和关闭InputStream?

时间:2012-05-15 13:04:44

标签: java exception-handling inputstream

以下哪一项是关闭和声明inputStream的首选方法。

InputStream is = null; 
String md5;
try{
    is = new FileInputStream(FILE.getAbsoluteFile());
    md5 = UTILS.getMD5Info(is);
} finally{
    if(is != null) 
        is.close();
}

InputStream is = new FileInputStream(FILE.getAbsoluteFile()); 
String md5;
try{
    md5 = UTILS.getMD5Info(is);
} finally{
    is.close();
}

我认为两者之间并没有太大区别,但第二种方式看起来更好,因为它有点短。如果我们不想捕获异常并且只是对收集inputStream的垃圾感兴趣,那么在try块中是否有任何初始化输入流的用法?

3 个答案:

答案 0 :(得分:6)

如果在try和finally之间捕获到IOException,则第一个也会处理FileInputStream的构造函数抛出IOException,而第二个不抛出IOException的情况。他们不会做同样的事情。原样,第二个更干净。

从Java 7开始,最好的方法是使用try-with-resources语句:

try (InputStream is = new FileInputStream(FILE.getAbsoluteFile())) {
    md5 = UTILS.getMD5Info(is);
}

答案 1 :(得分:6)

如何使用Java 7功能try-with-resources

try (InputStream is = new FileInputStream(FILE.getAbsoluteFile())) {
    ...
} catch (IOException e) {
    e.printStackTrace();
}

如果您想要绝对准确,那就太难看了(不要忘记任何读者可能会在IOException上抛出额外的close()!):

InputStream is = null;

try {
    is = new FileInputStream(FILE.getAbsoluteFile());

    // Your md5() magic here

} catch (FileNotFoundException e) {
    e.printStackTrace();
} catch (IOException e) {
    e.printStackTrace();
} finally {
    if (is != null) {
        try {
            is.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

在第二个版本中,当构造函数抛出异常时(例如,找不到文件或者您没有访问它的权限)时,您不会处理这种情况。

如果您也想处理这种情况,则需要在InputStream块之前声明try-catch(或将throws IOException添加到当前函数定义中。)

但是,您需要检查它是否已正确初始化,即null块中不是finally

此外,如果你想要close()流,你必须处理可能的IOException(通常情况下,如果你能打开流,就不会发生这种情况)。

答案 2 :(得分:4)

第二种方法的问题是FileInputStream构造函数可以抛出一个FileNotFoundException异常,你不会在你指定的try块中捕获(如果你想要捕获这样的异常),那么这种方法你控制力较弱。

我会选择第一个。