Нужно ли закрывать ByteArrayInputStream?
Краткий вопрос:
Я наткнулся на старый код, где создается объект ByteArrayInputStream следующим образом:
new BufferedReader(new InputStreamReader(new ByteArrayInputStream(somebytes)));
После этого BufferedReader используется для чтения somebytes построчно. Всё работает нормально, но я заметил, что BufferedReader никогда не закрывается.
Это часть долгосрочного приложения на WebSphere, somebytes не слишком большие (всего 200к), этот код вызывается всего несколько раз в неделю, и у нас не наблюдается явных утечек памяти. Я ожидаю, что все объекты успешно подлежат сборке мусора.
Я всегда (однажды) слышал, что потоки ввода/вывода необходимо закрывать в блоке finally. Разве ByteStream является исключением из этого правила?
С уважением,
Жероен.
3 ответ(ов)
Закрывать чтение всегда хорошая практика. Однако не закрытие ByteArrayInputStream не имеет столь серьезных потенциальных негативных последствий, так как вы не работаете с файлом, а просто с массивом байтов в памяти.
Как упоминал @TomaszNurkiewicz, всегда полезно закрывать открытые потоки. Хороший способ сделать это — использовать блок try-with-resources, который автоматически закроет ресурсы после завершения блока try. Например:
try (InputStream inputStream = new ByteArrayInputStream(bytes);
Workbook workBook = new XSSFWorkbook(inputStream)) {
// Ваша логика работы с workBook
}
В данном случае и Workbook, и InputStream реализуют интерфейс Closeable, поэтому после завершения блока try (нормально или с исключением) потоки будут закрыты автоматически. Это избавляет от необходимости вручную вызывать close() и предотвращает возможные утечки ресурсов.
Ресурсы следует закрывать в блоке finally (или его эквиваленте). Однако, если вы просто работаете с байтами, это не так критично. Тем не менее, в случае записи будьте осторожны и не забудьте выполнить flush в обычных ситуациях.
Как прочитать/конвертировать InputStream в строку в Java?
Как преобразовать строку в InputStream в Java?
Ошибка java.lang.OutOfMemoryError: превышен лимит времени работы сборщика мусора
Есть ли деструктор в Java?
Знаете ли вы о каких-либо инструментах для анализа логов сборки мусора в Java? [закрыто]