我正在尝试在一个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
的资源,但是我必须在创建InputStream之前调用ImageIO.write()
方法。
我必须使用通常的 try-catch-finally 来关闭流吗?
答案 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块。最后是不需要的,除了您想在关闭资源期间捕获异常(抑制的异常)