Netbeans中的"转换为资源试用" - 酷豆?

Fre*_*Man 10 java netbeans

我在Netbeans 7.1.2中有以下代码:

BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(filename));
bos.write(newRawData);
bos.close();
Run Code Online (Sandbox Code Playgroud)

警告表明我"转换为尝试资源".当我选择这样做时,我的代码变为:

try (BufferedOutputStream bufferedFos = new BufferedOutputStream(new FileOutputStream(filename))) {
        bufferedFos.write(newRawData);
    }
Run Code Online (Sandbox Code Playgroud)

这类似于在C#中使用(...)的语法...它们的工作方式是否相同?使用第二种格式有什么缺点吗?我担心没有bos.close();,但是这种格式根本没有必要吗?

Kep*_*pil 14

这是Java 7中引入的一种新语法,它在声明try(...)语句时负责关闭您指定的所有资源.更多信息可以在这里找到.
所以不,你不必做bos.close(),它是由Java执行的.你可以高枕无忧.
唯一的缺点是您的代码仅适用于Java 7+.


Jon*_*and 5

注意

Java 7引入了 "try with resources"语句作为try...finally语句的替代.基本上,它所做的只是让你不必添加:

finally {
  if(resource != null) resource.close();
}
Run Code Online (Sandbox Code Playgroud)

到你的try陈述结束.如果您使用它,您的代码将仅适用于Java 7及更高版本.

回答

try是Java中声明的一部分try...catch.您给出的警告的完整解决方案是:

try(BufferedOutputStream bufferedFos = new BufferedOutputStream(new FileOutputStream(filename))) {
  bufferedFos.write(newRawData);
} catch(FileNotFoundException e) {
  e.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)

"try with resources"块使用与块相同的结构try...catch,但会在块执行后自动关闭块内创建的所有资源.这就是为什么你bufferedFos.close();在代码中看不到声明的原因.