Я пытаюсь записать изображение входного потока в OutputStream, чтобы отобразить изображение в браузере, это код:

try
{
    InputStream input = Filer.readImage("images/test.jpg");
    byte[] buffer = new byte[1024];
    int bytesRead;
    while ((bytesRead = input.read(buffer)) != -1)
    {
        responseBody.write(buffer, 0, bytesRead);
    }
}
catch(IOException e)
{
    System.out.println(e);
}

ReadImage:

public static InputStream readImage(String file) throws IOException {
    try (InputStream input = new FileInputStream(file)) {

        return input;
    }
}

Но я получаю сообщение об ошибке при записи:

java.io.IOException: Stream Closed

Любые идеи?

0
user3112115 17 Дек 2013 в 22:07

2 ответа

Лучший ответ

Команда try-with-resources закрывает поток при выходе из блока.

try (InputStream input = new FileInputStream(file)) {

Т.е. когда ваш метод вернется.

Просто удалите его и позаботьтесь о том, чтобы закрыть поток в конце тела другого вашего метода.

Как указано в комментариях, вот ссылка на официальное руководство по try-with-resources.

5
Sotirios Delimanolis 17 Дек 2013 в 18:53

Взято из учебника Oracle, ресурс закрывается по завершении инструкции:

Оператор try-with-resources обеспечивает закрытие каждого ресурса в конце оператора. Любой объект, который реализует java.lang.AutoCloseable, который включает все объекты, которые реализуют java.io.Closeable, может использоваться в качестве ресурса.

До Java SE 7 можно было использовать блок finally, чтобы гарантировать, что ресурс закрыт, независимо от того, завершается ли инструкция try нормально или внезапно. В следующем примере вместо оператора try-with-resources используется блок finally:

1
Al Sweetman 17 Дек 2013 в 18:15