2016-04-26 5 views
3

Я использую ответ на How to convert InputStream to virtual File, который использует org.apache.commons.io.IOUtils скопировать данный InputStream к FileOutputStream для того, чтобы создать File.Должен ли я закрыть InputStream из org.apache.commons.io.IOUtils

Должен ли я закрывать InputStream?

+0

Не нужно закрывать входные потоки как таковые, мы явно должны закрывать выходные потоки, вы можете закрыть его, если хотите, можете ли вы указать, с какой проблемой вы столкнулись? –

+0

У меня нет проблем. У меня всегда есть проблемы, чтобы понять, когда и почему я должен закрывать потоки. Я видел код кода для преобразования InputStream в виртуальный файл без закрытия InputStream. Поэтому я подумал, что нужно, чтобы закрыть его. – ilopezluna

+1

После повторного рассмотрения, я думаю, мы должны закрыть его, поскольку он будет содержать указатель/дескриптор нашего файла, смещение, до которого оно прочитало содержимое файла, и другую информацию относительно того же. Если мы закроем его, мы выпустим эффективную программу создания ресурсов. –

ответ

6

Лучше всего закрыть InputStream. См. Это question.

org.apache.commons.io.IOUtils.copy Не закрывайте потоки. Поэтому вам нужно закрыть.

См Javadoc

Везде, где это возможно, методы в этом классе не вровень или закрыть поток. Это делается для того, чтобы избежать принятия не переносных предположений о происхождении потоков и дальнейшего использования. Таким образом, вызывающий абонент по-прежнему отвечает для закрытия потоков после использования.

1

Edit: После повторного прочтения вопроса, я должен исправить мой ответ, потому что вопрос, по-видимому был о InputStream от ссылочного ответа и не OutputStream. InputStream необходимо закрыть (см. Ответ от @Adi). Однако OutputStream находится в заявлении try-with-resources, так что это тот, который вам не нужно закрывать.

Ответ, на который делается ссылка в вопросе, используется Java 7 try-with-resources Statement, который гарантирует, что ресурс будет закрыт в конце инструкции.

Оператор try-with-resources - это оператор try, который объявляет один или больше ресурсов. Ресурс - это объект, который должен быть закрыт после завершения . Оператор try-with-resources гарантирует, что каждый ресурс будет закрыт в конце инструкции.

Так что для OutputStream, NO, в этом конкретном случае вам не нужно, чтобы закрыть OutputStream себя, если вы используете примерочную с-ресурсом.

InputStream однако должен быть закрыт.