Закрытие InputStream, содержащегося в объекте - PullRequest
0 голосов
/ 03 мая 2018

Как правильно закрыть InputStream, являющийся частью объекта?

class Uploadable {
    InputStream is;
    ...
}

Этот объект передается в метод загрузки:

uploadMethod(Uploadable up);

Способ создания загружаемого файла:

  • Из Part объекта в Servlet. Существует part.getInputStream(), который возвращает InputStream.
  • От byte[], который передается некоторыми веб-службами. InputStream можно получить с помощью new ByteArrayInputStream.

Проблема в том, что когда InputStream находится в объекте, возможность его аккуратно закрыть как бы потеряна, поскольку объект создается в одном месте, но используется в других местах. Это ограничивает мою способность использовать try-with-resources, потому что объект не может использоваться внутри контекста блока try. Единственный способ, который я вижу, - это сделать is неизменным и создать специальный Uploadable.close() метод, который закрывает InputStream, когда это делается. Кроме того, я могу сохранить byte[] вместо InputStream и преобразовать part.getInputStream() в массив байтов. Тем не менее, это кажется плохим решением для производительности, так как я получу InputStream, преобразую его в byte[], чтобы потом снова преобразовать в InputStream в методе загрузки.

Полагаю, это очень известная проблема, но я не могу найти лучшие практики. Oracle всегда закрывает объект в блоке try-with-resources или в блоке finally.

1 Ответ

0 голосов
/ 03 мая 2018

Я бы посоветовал вам реализовать AutoCloseable самостоятельно в Uploadable и оставить закрывающим это для создателя / звонящего.

class Uploadable implements AutoCloseable {
    InputStream is;
    public void close() throws IOException {
        if (is != null) {
            is.close();
        }
    }
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...