在InputStream上使用finally关键字#close()

时间:2014-02-21 20:07:29

标签: java inputstream ioexception try-catch-finally

基本上我不确定finally关键字的正确用法是什么,我只知道文本定义:保证代码将被执行,因为有时它不会。所以我希望我能就这个特定的代码得到一些指示:

此外,如果try-catch阻止调用InputStream#close()是不必要的

try {
    inputStream = entity.getContent();

    BufferedReader br = new BufferedReader(new InputStreamReader(inputStream));
    StringBuilder sb = new StringBuilder();

    String line = null;

    while((line = br.readLine()) != null) {
        sb.append(line);
        sb.append("\n");
    }

    responseText = sb.toString();
} catch(IOException e) {
    e.printStackTrace();
} finally {
    if (inputStream != null) {
        try {
            inputStream.close();
        } catch(IOException e) {
            e.printStackTrace();
        }
    }
}

6 个答案:

答案 0 :(得分:1)

您还可以使用try-with-resources

像这样:

try (YourResource resource) {
    //Todo...
} catch(YourSpecificException ex) {
    //Todo...
}

在退出施工后,您在parantheses之间宣布的资源将自动关闭。

您甚至可以一次声明多个资源,用分号分隔它们。这一切都在上面的链接中,真的。

答案 1 :(得分:0)

finally块将始终执行,无论异常是否来自try块。所以finally块用作后期活动。在您用来关闭的代码中流。

答案 2 :(得分:0)

finally块确保无论您在尝试(成功或异常)期间发生什么,它都将始终运行。这通常在清理资源时使用,例如InputStreamSocket

try with resource范例清除了这一点,但会自动关闭Closeable

的内容
try( InputStream inputStream = entity.getContent() )
{

}catch(Exception e)
{

}//declared resource in try automatically closed

http://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html

答案 3 :(得分:0)

try { 
  // Here the guarded area starts


  // Here the guarded area ends
} catch {
  // This block is executed when an exception occurs inside the guarded area

} finally {
  // This block is executed always before leaving try - catch - finally block
  // If there is an exception, then first catch block is executed and then finally
}

您拥有的finally块内的代码是关闭流的常用结构。如果在受保护区域(inputStream != null)内创建了一个流,那么最后块将关闭它。如果在创建inputStream之前有异常,则执行finally块,但因为inputStream == nullif语句中的代码不会执行。

答案 4 :(得分:0)

try块正在执行时,发生的任何异常都会将执行转移到catch块然后转移到finally块,但是如果在try中没有发生异常,则执行代码将在尝试finally块之后继续,在您的代码中,您尝试使用IO资源,如果它不能被进程占用则可能引发IO异常,那么将不会将引用分配给inputStream finally块必须找到在任何情况下关闭IO连接,如果资源被占用或者它是null然后什么都没有,记得最后总是会执行任何情况,最好关闭连接到数据库和其他资源以释放内存有时

答案 5 :(得分:0)

我最终使用的时间通常都是......

  • 资源处理(IO,DB连接,套接字)
  • 并发(锁定释放,保证计数器更改)
  • 最终确定(try { } finally { super.finalize(); }
  • 记录状态