Try-With-Resources 中的多个资源 - 里面的语句
Multiple resources in Try-With-Resources - statments inside
我试图在单个 Try-With-Resources
语句中指定多个资源,但我的情况与我在其他帖子上看到的情况有点不同。
我刚刚尝试了以下 Try-With-Resources
public static String myPublicStaticMethod(BufferedImage bufferedImage, String fileName) {
try (ByteArrayOutputStream os = new ByteArrayOutputStream();
ImageIO.write(bufferedImage, "png", os);
InputStream is = new ByteArrayInputStream(os.toByteArray());
) {
.....
.....
}
但我的代码无法编译并出现此错误:
Resource references are not supported at language level '8'
因此,如您所见,我的目标是将 ByteArrayOutputStream os
和 InputStream is
都声明为 Try-With-Resources
的资源,但我必须在创建之前调用 ImageIO.write()
方法输入流。
我必须使用通常的 try-catch-finally 来关闭流吗?
首先,请确保您的 IDE language level is Java 8
如果你想添加额外的代码行,这些代码行不会在 try with resources 块中创建可自动关闭的资源,那么你可以添加特定的方法来包装它,在你的情况下:
private InputStream getInputStream() {
ImageIO.write(bufferedImage, "png", os);
return new ByteArrayInputStream(os.toByteArray());
}
并尝试使用资源调用它:
try (ByteArrayOutputStream os = new ByteArrayOutputStream();
InputStream is = getInputStream()) {
我假设(如在您的代码中)与创建资源相关的额外行,如果不是像@PavelSmirnov 建议的那样使用您的第二个资源打开内部尝试
您只能在 try-with-resources 块中声明实现 AutoCloseable
接口的对象,因此您的 ImageIO.write(bufferedImage, "png", os);
语句在那里无效。
作为解决方法,您可以将此代码拆分为两个 try-catch-blocks,即:
try (ByteArrayOutputStream os = new ByteArrayOutputStream()) {
ImageIO.write(bufferedImage, "png", os);
try(InputStream is = new ByteArrayInputStream(os.toByteArray())) {
//...
}
}
尝试这样的事情:
public static String myPublicStaticMethod(BufferedImage bufferedImage, String fileName) {
try (ByteArrayOutputStream os = new ByteArrayOutputStream();
InputStream is = new ByteArrayInputStream(os.toByteArray()) {
ImageIO.write(bufferedImage, "png", os);
.....
}
你只需在try声明中声明使用的资源,在try块中进行操作。 Ofc 你也需要 catch 块。 Finally 不需要,除非您想在资源关闭期间捕获异常(抑制异常)
我试图在单个 Try-With-Resources
语句中指定多个资源,但我的情况与我在其他帖子上看到的情况有点不同。
我刚刚尝试了以下 Try-With-Resources
public static String myPublicStaticMethod(BufferedImage bufferedImage, String fileName) {
try (ByteArrayOutputStream os = new ByteArrayOutputStream();
ImageIO.write(bufferedImage, "png", os);
InputStream is = new ByteArrayInputStream(os.toByteArray());
) {
.....
.....
}
但我的代码无法编译并出现此错误:
Resource references are not supported at language level '8'
因此,如您所见,我的目标是将 ByteArrayOutputStream os
和 InputStream is
都声明为 Try-With-Resources
的资源,但我必须在创建之前调用 ImageIO.write()
方法输入流。
我必须使用通常的 try-catch-finally 来关闭流吗?
首先,请确保您的 IDE language level is Java 8
如果你想添加额外的代码行,这些代码行不会在 try with resources 块中创建可自动关闭的资源,那么你可以添加特定的方法来包装它,在你的情况下:
private InputStream getInputStream() {
ImageIO.write(bufferedImage, "png", os);
return new ByteArrayInputStream(os.toByteArray());
}
并尝试使用资源调用它:
try (ByteArrayOutputStream os = new ByteArrayOutputStream();
InputStream is = getInputStream()) {
我假设(如在您的代码中)与创建资源相关的额外行,如果不是像@PavelSmirnov 建议的那样使用您的第二个资源打开内部尝试
您只能在 try-with-resources 块中声明实现 AutoCloseable
接口的对象,因此您的 ImageIO.write(bufferedImage, "png", os);
语句在那里无效。
作为解决方法,您可以将此代码拆分为两个 try-catch-blocks,即:
try (ByteArrayOutputStream os = new ByteArrayOutputStream()) {
ImageIO.write(bufferedImage, "png", os);
try(InputStream is = new ByteArrayInputStream(os.toByteArray())) {
//...
}
}
尝试这样的事情:
public static String myPublicStaticMethod(BufferedImage bufferedImage, String fileName) {
try (ByteArrayOutputStream os = new ByteArrayOutputStream();
InputStream is = new ByteArrayInputStream(os.toByteArray()) {
ImageIO.write(bufferedImage, "png", os);
.....
}
你只需在try声明中声明使用的资源,在try块中进行操作。 Ofc 你也需要 catch 块。 Finally 不需要,除非您想在资源关闭期间捕获异常(抑制异常)