Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何申报和关闭InputSteam?_Java_Exception Handling_Inputstream - Fatal编程技术网

Java 如何申报和关闭InputSteam?

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的首选方法

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();
        }
    }
}