Несколько ресурсов в Try-With-Resources - статистика внутри - PullRequest
1 голос
/ 10 июля 2019

Я пытаюсь указать несколько ресурсов в одной инструкции 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() перед созданием InputStream.

Должен ли я использовать обычный try-catch-finally , чтобы закрыть потоки?

Ответы [ 3 ]

3 голосов
/ 10 июля 2019

Вы можете объявлять только объекты, реализующие интерфейс AutoCloseable внутри блока try-with-resources , поэтому ваш оператор ImageIO.write(bufferedImage, "png", os); там недопустим.

В качестве обходного пути вы можете разделить этот код на два блока try-catch, т.е.

try (ByteArrayOutputStream os = new ByteArrayOutputStream()) {
    ImageIO.write(bufferedImage, "png", os);
    try(InputStream is = new ByteArrayInputStream(os.toByteArray())) {
        //...
    }
}
0 голосов
/ 10 июля 2019

Попробуйте что-то вроде этого:

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.Наконец, не требуется, за исключением того, что вы хотите перехватывать исключения во время закрытия ресурсов (исключенные исключения)

0 голосов
/ 10 июля 2019

Во-первых, убедитесь, что ваш языковой уровень IDE - это 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

...