我在Netbeans 7.1.2中有以下代码:
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(filename));
bos.write(newRawData);
bos.close();
警告表明我“转换为试用资源”。当我选择这样做时,我的代码变为:
try (BufferedOutputStream bufferedFos = new BufferedOutputStream(new FileOutputStream(filename))) {
bufferedFos.write(newRawData);
}
这看起来类似于在C#中使用(...)的语法...它们的工作方式是否相同?使用第二种格式有什么缺点吗?我担心缺少bos.close();
,但这种格式是不是没必要?
答案 0 :(得分:14)
这是Java 7中引入的一种新语法,它在声明try(...)
语句时负责关闭您指定的所有资源。可以找到更多信息here
所以不,你不必做bos.close()
,它是由Java执行的。你可以高枕无忧
唯一的缺点是您的代码仅适用于Java 7+。
答案 1 :(得分:5)
“try with resources”语句为introduced in Java 7,以替代try...finally
语句。基本上,它所做的只是让你不必添加:
finally {
if(resource != null) resource.close();
}
到try
语句的末尾。如果您使用它,您的代码将仅适用于Java 7及更高版本。
try
是Java中一个名为try...catch
的语句的一部分。您给出的警告的完整解决方案是:
try(BufferedOutputStream bufferedFos = new BufferedOutputStream(new FileOutputStream(filename))) {
bufferedFos.write(newRawData);
} catch(FileNotFoundException e) {
e.printStackTrace();
}
“try with resources”块使用与try...catch
块相同的结构,但会在块执行后自动关闭块内创建的所有资源。这就是您在代码中看不到bufferedFos.close();
语句的原因。