Как правильно закрыть 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
.