Java: делает ли использование буферизованного входного потока сделать преобразование входных потоков в byte[] более эффективным?

Я хочу преобразовать входной поток в байт [], и я использую IOUtils.toByteArray(inputStream), Будет ли это сделать более эффективным с помощью обертки, как BufferedInputStream для inputStream? Это экономит память?

2 ответа

Будет ли он более эффективным с помощью оболочки, как BufferedInputStream для inputStream?

Не имеет никакого значения. IOUtils.toByteArray считывает данные в буфер размером 4096 байт. BufferedInputStream по умолчанию использует буфер 8192 байта. С помощью BufferedInputStream выполняет меньше операций ввода-вывода, но вам нужен очень быстрый источник данных, чтобы заметить разницу.

Если вы читаете InputStream по одному байту за раз (или несколько байтов), то использование BufferedInputStream действительно повышает производительность, поскольку уменьшает число вызовов операционной системы в 8000 раз. А вызовы операционной системы сравнительно долго занимают.

Это экономит память?

Нет. IOUtils.toByteArray создаст new byte[4096] независимо от того, передан ли буферизованный или небуферизованный InputStream. BufferdedInputStream стоит немного больше памяти для создания. Но ничего существенного.

С точки зрения конечного потребления памяти это не помогло бы, так как в любом случае вам нужно будет переместить весь поток в byte[]размер массива будет одинаковым, поэтому потребление памяти будет таким же.

Какие BufferedInputStream делает, он оборачивает другой поток и вместо этого записывает в него напрямую, он буферизует ваш ввод во внутренний буфер и записывает в основной поток только тогда, когда closes/flushes или когда внутренний буфер заполнен. Это может ускорить ваши операции записи, так как вы будете делать их в пакетном режиме вместо того, чтобы писать каждый раз напрямую, но это не поможет, если вы будете читать их с другой стороны.

Другие вопросы по тегам