Java SE 7及更高版本中的try-with-resources语句

时间:2015-12-29 00:13:21

标签: java io try-with-resources

我正在使用Java SDK8,我创建了一个inputStream和outputStream对象。

在Java SE 7之前,我可以使用finally块来确保关闭这些资源,无论try语句是否正常完成。 我在Java SE 7及更高版本中读到,我可以使用try-with-resources语句,如果我正在使用的资源实现了接口java.lang.AutoCloseable,我不需要在finally块中关闭此资源更多。

我的问题是: 1.如果我使用的是实现接口java.lang.AutoCloseable的资源,我是不正确的,我不需要在finally块中关闭它,即使抛出异常也会关闭它?如果是这样,是否有必须存在的先决条件? (例如在try块中创建资源?)
2. try-with-resources语句究竟意味着什么?

提前多多感谢!!

1 个答案:

答案 0 :(得分:2)

  
      
  1. 如果我正在使用实现java.lang.AutoCloseable接口的资源,我是不是需要在finally块中关闭它,即使抛出异常也会关闭它?
  2.   

  

如果是这样,是否存在必须存在的前提条件? (例如在try块中创建资源?)

必须在try-with-resources语句中创建资源(见下文)。

  
      
  1. try-with-resources语句究竟意味着什么?
  2.   

这是一个try-with-resources声明:

try (FileReader fr = FileReader(path)) {
    // use fr here
}

请注意FileReader的初始化 <{1}}(在新的try部分中)。这就是声明如何知道以后需要关闭的内容。

the tutorial中的更多内容,虽然我不喜欢他们的第一个例子,因为它依赖于A)()构造函数从不抛出的事实,以及B)事实{{1}当BufferedReader关闭时,我会关闭BufferedReader。这些对于FileReader都是正确的,但在一般情况下它是一个糟糕的例子。)

完整的细节,包括BufferedReader格式的BufferedReader内容的翻译,位于the specification

请注意,您可以在语句中创建多个资源;它们以创建的相反顺序关闭:

try-with-resources

虽然你可以写:

try/catch/finally

...您必须知道肯定 try ( FileReader fr = new FileReader(fileName); NiftyThingUsingReader nifty = new NiftyThingUsingReader(fr) ) { // ...use `nifty` here } 从不抛出异常,try ( NiftyThingUsingReader nifty = new NiftyThingUsingReader(new FileReader(fileName)) ) { // ...use `nifty` here } 将关闭基础NiftyThingUsingReader(FileReader),因为它将由try-with-resources本身处理。如果您不确定,请将它们分开,以便try-with-resources语句关闭NiftyThingUsingReader#close即使FileReader构造函数抛出,即使FileReader未关闭它

资源不必相互依赖(直接);例如,这是一种相当常见的情况,您希望处理输入和输出:

NiftyThingUsingReader(FileReader)