2012-05-15 34 views
4

以下哪一项是关闭和声明inputStream的首选方式。如何声明并关闭InputSteam?

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

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

由于Java 7,最好的办法是使用try-与资源声明:

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

*第二*更清洁或第一*是? – dj18

+0

“现在,第二个更清洁”是什么含糊? –

+0

只是澄清,因为你解释了为什么第一个更好,所以我想知道你是否打算继续以同样的态度继续说第一个更清洁。你能说明什么使第二个“更清洁”? – dj18

4

第二种方法的问题是FileInputStream构造函数可能会抛出FileNotFoundException异常,您不会在您指定的try块内捕获异常(如果您想要捕获此类异常),所以使用此方法可以减少控制。

我会去第一个。

6

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

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

正如它,如果你想成为绝对精确是很丑陋(不要忘记,任何读者可能会在close()抛出一个附加IOException!):

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

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

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

但是,您需要检查它是否已被正确初始化,即finally块中不是null。此外,如果您想要close()流,则必须处理可能的IOException(通常,如果您能够打开流,则永远不会发生这种情况)。