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
или когда внутренний буфер заполнен. Это может ускорить ваши операции записи, так как вы будете делать их в пакетном режиме вместо того, чтобы писать каждый раз напрямую, но это не поможет, если вы будете читать их с другой стороны.