Нужно ли закрывать Java ByteArrayInputStream, построенный из байтов из локальной строковой переменной?

Допустим, я создаю Java ByteArrayInputStream из локальной переменной String. Например, предположим, что у меня есть большая строка с именем csv, представляющая содержимое CSV-файла, и мне нужно поместить ее во входной поток, чтобы компонент моей программы читал из этой строки, а не из файла. . Например,

InputStream inputStream = new ByteArrayInputStream(csv.​getBytes(StandardCharsets.UTF_8));

Нужно ли закрывать этот inputStream после того, как я закончу с ним обработку? Я знаю, что обычно рекомендуется закрывать неиспользуемые потоки ввода, часто с помощью конструкции try-resources. Что меня особенно интересует прямо сейчас, так это каковы будут последствия решения не закрывать этот входной поток до того, как эта переменная выйдет из области видимости, когда ее метод вернется. Будет ли утечка памяти из-за того, что я оставил поток открыт? Или это не имело бы значения, потому что поток был открыт в локальной переменной, а не в ресурсе File?


person ecbrodie    schedule 27.11.2014    source источник


Ответы (2)


Нет. Вам не нужно закрывать ByteArrayInputStream. Поскольку он находится в памяти, не было бы никаких последствий (был бы сборщик мусора). Теперь, если InputStream был связан с внешним ресурсом (например, File), это может привести к тому, что у вас закончатся дескрипторы файлов.

В ByteArrayInputStream Javadoc говорится (частично),

Закрытие ByteArrayOutputStream не имеет никакого эффекта.

person Elliott Frisch    schedule 27.11.2014

Я знаю, что обычно хорошей практикой является закрытие [...]

Тогда просто сделай это (тм) :)

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

В случае ByteArrayInputStream никаких последствий; для некоторых других реализаций InputStream, утечек, утечек и еще утечек.

Короче говоря: всегда .close() безопасно, вы никогда не проиграете; либо с помощью оператора try-with-resources в Java 7+, либо для более ранних версий, в идеале с использованием Гуава Closer.

person fge    schedule 27.11.2014