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