0

Нужно ли закрывать ByteArrayInputStream?

17

Краткий вопрос:

Я наткнулся на старый код, где создается объект ByteArrayInputStream следующим образом:

new BufferedReader(new InputStreamReader(new ByteArrayInputStream(somebytes)));

После этого BufferedReader используется для чтения somebytes построчно. Всё работает нормально, но я заметил, что BufferedReader никогда не закрывается.

Это часть долгосрочного приложения на WebSphere, somebytes не слишком большие (всего 200к), этот код вызывается всего несколько раз в неделю, и у нас не наблюдается явных утечек памяти. Я ожидаю, что все объекты успешно подлежат сборке мусора.

Я всегда (однажды) слышал, что потоки ввода/вывода необходимо закрывать в блоке finally. Разве ByteStream является исключением из этого правила?

С уважением,
Жероен.

3 ответ(ов)

0

Закрывать чтение всегда хорошая практика. Однако не закрытие ByteArrayInputStream не имеет столь серьезных потенциальных негативных последствий, так как вы не работаете с файлом, а просто с массивом байтов в памяти.

0

Как упоминал @TomaszNurkiewicz, всегда полезно закрывать открытые потоки. Хороший способ сделать это — использовать блок try-with-resources, который автоматически закроет ресурсы после завершения блока try. Например:

try (InputStream inputStream = new ByteArrayInputStream(bytes); 
     Workbook workBook = new XSSFWorkbook(inputStream)) {
    // Ваша логика работы с workBook
}

В данном случае и Workbook, и InputStream реализуют интерфейс Closeable, поэтому после завершения блока try (нормально или с исключением) потоки будут закрыты автоматически. Это избавляет от необходимости вручную вызывать close() и предотвращает возможные утечки ресурсов.

0

Ресурсы следует закрывать в блоке finally (или его эквиваленте). Однако, если вы просто работаете с байтами, это не так критично. Тем не менее, в случае записи будьте осторожны и не забудьте выполнить flush в обычных ситуациях.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь