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



我在代码中使用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();
}
}

否。

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

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

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

更新:

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

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

不,你没有。让我们看一个try-catch-finallytry-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,因为它在try块执行完毕后自行关闭。欲了解更多参考,请访问此博客

您不必关闭您在try子句中定义的资源。但是,举个例子,在try的正文中也有这个:

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

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

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

最新更新