Try-With-Resources中的多个资源-内部语句

时间:2019-07-10 10:37:36

标签: java exception try-catch try-with-resources

我正在尝试在一个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的资源,但是我必须在创建InputStream之前调用ImageIO.write()方法。

我必须使用通常的 try-catch-finally 来关闭流吗?

3 个答案:

答案 0 :(得分:3)

您只能在 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())) {
        //...
    }
}

答案 1 :(得分:0)

首先,请确保您的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建议的那样,仅使用第二个资源打开内部尝试

答案 2 :(得分:0)

尝试这样的事情:

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块。最后是不需要的,除了您想在关闭资源期间捕获异常(抑制的异常)