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 osInputStream 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 不需要,除非您想在资源关闭期间捕获异常(抑制异常)