Java 如何申报和关闭InputSteam?
以下哪项是关闭和声明inputStream的首选方法Java 如何申报和关闭InputSteam?,java,exception-handling,inputstream,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 = null;
String md5;
try{
is = new FileInputStream(FILE.getAbsoluteFile());
md5 = UTILS.getMD5Info(is);
} finally{
if(is != null)
is.close();
}
或
我看不出两者有多大区别,但第二种方式看起来更好,因为它有点短。如果我们不打算捕获异常并且只对输入流进行垃圾收集感兴趣,那么在try块中初始化输入流有什么用处吗?第二种方法的问题是
FileInputStream
构造函数可以抛出一个FileNotFoundException
异常,而您不会捕获它在您指定的try块中(以防您想要捕获这样的异常),因此使用这种方法,您的控制能力会降低
我会选择第一个。如果在try和finally之间捕获IOException,那么第一个也会处理FileInputStream的构造函数抛出IOException的情况,而第二个则不会。他们不会做同样的事情。就目前而言,第二个更干净 自Java 7以来,最好的方法是使用try with resources语句:
try (InputStream is = new FileInputStream(FILE.getAbsoluteFile())) {
md5 = UTILS.getMD5Info(is);
}
使用Java7特性怎么样 因为如果你想绝对精确的话,它是非常难看的(不要忘记任何读者可能会在
close()
!)上抛出一个额外的IOException
):
在您的第二个版本中,当构造函数抛出异常(例如,找不到文件或您没有访问该文件的权限)时,您不会处理这种情况
如果您也想处理这种情况,则需要在try catch
块之前声明InputStream
(或将throws IOException
添加到当前函数定义中)
但是,您需要检查它是否已正确初始化,即在finally
块中它不是null
此外,如果你想
close()
流,你必须处理可能的IOException
(如果你能够打开流,通常不会发生这种情况)。第一个更好。第二个更干净,还是第一个更干净?在“原样,第二个更干净”中有什么不明确的地方?只是澄清一下,因为你解释了为什么第一个更好,所以我想知道你是否想继续保持同样的思路,说第一个更干净。你能解释一下第二个“更干净”的原因吗?我没说第一个更好。我确实说过,如果try和finally之间有一个catch(IOException)
子句,那么这两个语句会做不同的事情。有时您希望捕获构造函数引发的FileNotFoundException,有时您不想捕获。由于IOException未捕获在OP的代码段中,因此没有理由将流创建包装在try块中,因为它强制代码在finally子句中处理null。在这种情况下,第二个更干净。
try (InputStream is = new FileInputStream(FILE.getAbsoluteFile())) {
md5 = UTILS.getMD5Info(is);
}
try (InputStream is = new FileInputStream(FILE.getAbsoluteFile())) {
...
} catch (IOException e) {
e.printStackTrace();
}
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();
}
}
}