Подтвердить что ты не робот

Мне нужно закрыть ByteArrayInputStream?

Короткий вопрос,

Я видел в каком-то старом коде, где был создан ByteArrayInputStream, например:

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

И затем BufferedReader используется для чтения строки somebytes. Все работает нормально, но я заметил, что BufferedReader никогда не закрывается. Все это работает в давно запущенном приложении websphere, somebytes не очень страшны (всего 200k), он вызывается только несколько раз в неделю, и мы не испытываем никаких явных утечек памяти. Поэтому я ожидаю, что все объекты будут успешно собраны мусором.

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

С уважением Йерун.

4b9b3361

Ответ 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, поэтому, как только попытка завершения блока (обычно или внезапно), поток будет закрыт точно.