Нужно ли закрывать 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
в обычных ситуациях.
Ошибка java.lang.OutOfMemoryError: превышен лимит времени работы сборщика мусора
Есть ли деструктор в Java?
"Остров изоляции" сборки мусора
Как считать файл из ZIP с помощью InputStream?
Знаете ли вы о каких-либо инструментах для анализа логов сборки мусора в Java? [закрыто]