如果我们使用try-with-resource,是否需要关闭资源

Jay*_*Jay 2 java try-with-resources

我在我的代码中使用try-with-resource块,想知道是否需要在方法结束时关闭资源或不需要?

try (S3Object object = s3.getObject(new GetObjectRequest(bucketName, key));
  BufferedReader br = new BufferedReader(new InputStreamReader(object.getObjectContent()));
  BufferedWriter bw = new BufferedWriter(new FileWriter(new File("output.txt")))){
  String line;

  while((line=br.readLine())!=null){
    bw.write(line);
    bw.newLine();
    bw.flush();
  }
}
Run Code Online (Sandbox Code Playgroud)

Zha*_*ang 6

没有.

try-with-resources语句确保在语句结束时关闭每个资源.实现java.lang.AutoCloseable的任何对象(包括实现java.io.Closeable的所有对象)都可以用作资源.

如果您使用的是java 6或更早版本:

在Java SE 7之前,您可以使用finally块来确保关闭资源,无论try语句是正常还是突然完成.

更新:

您可以在try-with-resources语句中声明一个或多个资源.

正如您在代码中使用的那样.


Gho*_*ica 2

您不必关闭在 try 子句中定义的资源。但是,根据您的示例,尝试的正文中也包含以下内容:

BufferedWriter bw = new BufferedWriter(new FileWriter(new File("output.txt"))))
Run Code Online (Sandbox Code Playgroud)

并且您的代码没有关闭该资源。这是错误的(保持文件系统句柄打开很可能是真正的资源泄漏)。

换句话说:您可能想要添加bw到您的 try-with-resources 子句中,因此它与 的定义一起出现S3Object object(请参阅此处的示例)。