以下哪一项是关闭和声明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块中是否有任何初始化输入流的用法?
答案 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块中捕获(如果你想要捕获这样的异常),那么这种方法你控制力较弱。
我会选择第一个。