Мне нужно закрыть ByteArrayInputStream?
Короткий вопрос,
Я видел в каком-то старом коде, где был создан ByteArrayInputStream
, например:
new BufferedReader(new InputStreamReader(new ByteArrayInputStream(somebytes)));
И затем BufferedReader
используется для чтения строки somebytes
.
Все работает нормально, но я заметил, что BufferedReader
никогда не закрывается.
Все это работает в давно запущенном приложении websphere, somebytes
не очень страшны (всего 200k), он вызывается только несколько раз в неделю, и мы не испытываем никаких явных утечек памяти. Поэтому я ожидаю, что все объекты будут успешно собраны мусором.
Я всегда (один раз) узнал, что потоки ввода/вывода должны быть закрыты в инструкции finally
. Являются ли ByteStreams
исключением из этого правила?
С уважением
Йерун.
Ответы
Ответ 1
Вам не нужно закрывать ByteArrayInputStream
, в тот момент, когда на него не ссылаются никакие переменные, сборщик мусора освободит поток и somebytes
(конечно, полагая, что они не упоминаются где-то еще).
Однако всегда полезно закрыть каждый поток, на самом деле, возможно, реализация, создающая поток, изменится в будущем, а вместо необработанных байтов вы будете читать файл? Также, скорее всего, будут жаловаться также статические инструменты анализа кода, такие как PMD или FindBugs (см. Комментарии).
Если вам скучно закрывать поток и быть вынужденным обрабатывать невозможно IOException
, вы можете использовать IOUtils:
IOUtils.closeQuietly(stream);
Ответ 2
Всегда хорошая практика - закрыть своих читателей. Однако не закрытие ByteArrayInputStream не имеет такого большого потенциального отрицательного эффекта, потому что вы не получаете доступ к файлу, а просто к массиву байтов в памяти.
Ответ 3
Ресурсы необходимо закрыть в finally
(или эквиваленте). Но где у вас просто есть несколько байт, нет, это не имеет значения. Хотя при написании, будьте осторожны с flush
в счастливом случае.
Ответ 4
Как сказал @TomaszNurkiewicz, всегда полезно закрыть открытый поток. Еще один хороший способ позволить ему сделать попытку блокировать себя. Используйте try с ресурсом вроде.......
try ( InputStream inputStream = new ByteArrayInputStream(bytes); Workbook workBook = new XSSFWorkbook(inputStream)) {
здесь Workbook и InputStream реализуют интерфейс Closeable, поэтому, как только попытка завершения блока (обычно или внезапно), поток будет закрыт точно.