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

时间:2018-12-12 14:35:07

标签: 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();
  }
}

3 个答案:

答案 0 :(得分:6)

否。

  

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

如果您使用的是Java 6或更旧版本:

  

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

更新

  

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

与您在代码中使用的一样。

答案 1 :(得分:2)

不,你不知道。让我们看一下df[(pd.DataFrame(df.b.str.split(';').tolist()).isin(my_list).any(1))&(df.a==2)] Out[88]: a b 1 2 type_2 2 2 type_1; type_2 3 2 type_1; type_3 5 2 type_1; type_2, type_3 try-catch-finally

的示例
try-with-resource

这是您的常规Scanner scanner = null; try { scanner = new Scanner(new File("test.txt")); while (scanner.hasNext()) { System.out.println(scanner.nextLine()); } } catch (FileNotFoundException e) { e.printStackTrace(); } finally { if (scanner != null) { scanner.close(); } } ,因为您要关闭try-catch-finally块中的扫描仪。现在让我们来看看finally

try-with-resource

您无需在此处关闭try (Scanner scanner = new Scanner(new File("test.txt"))) { while (scanner.hasNext()) { System.out.println(scanner.nextLine()); } } catch (FileNotFoundException fnfe) { fnfe.printStackTrace(); } ,因为它在scanner块执行完后自行关闭。有关更多参考,请访问此blog

答案 2 :(得分:1)

您不必关闭在try子句中定义的资源。但是,以您的示例为例,您也可以在尝试的 body 中找到它:

BufferedWriter bw = new BufferedWriter(new FileWriter(new File("output.txt"))))

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

换句话说:您可能想在您的try-with-resources子句中添加bw,因此它与S3Object object的定义一起放置(有关示例,请参见here