Есть ли какое-либо преимущество использования буферизованных потоков при работе с файлами, если вы одновременно читаете большие куски данных?

1

Если я имею дело с файлами, я обычно обертываю InputStream и OutputStream в BufferedInputStream и BufferedOutputStream - чтобы свести к минимуму количество операций ввода-вывода файлов, чтобы повысить производительность.

Я считаю, что это считается хорошей практикой и, как правило, рекомендуется.

Стандартный код "Копировать поток", который каждый использует при копировании InputStream в OutputStream:

(предполагая, что они не используют стороннюю библиотеку и хотят оставаться совместимыми с Java 6)

byte[] buffer = new byte[BUFFER_SIZE];
for (int n = 0; (n = input.read(buffer)) != EOF; ) {
    output.write(buffer, 0, n);
}

Я понял, что я могу просто установить BUFFER_SIZE на 8192 (размер буферов по умолчанию в BufferedInputStream и BufferedOutputStream).

Мой вопрос заключается в том, будет ли полезно использовать BufferedInputStream и BufferedOutputStream? Я не совсем уверен, как эти классы работают под капотом, и я не знаю, будет ли у них преимущество в использовании этой ситуации.

Благодарю.

Теги:

2 ответа

0
Лучший ответ

В общем случае нет, но если вы используете буфер, размер которого не равен двум, может быть полезно иметь считывание и запись power-of-2-aligned с помощью BufferedInputStream или BufferedOutputStream, размер буфера по умолчанию которого равен 8192 байта. Буферы в идеале должны быть кратными размеру блока файловой системы или, тем более, размер кластера.

Следует отметить, что оба этих потока имеют смазанные пути, когда передача больше, чем внутренний буфер: внутренний буфер опустошен, а оставшаяся часть передачи является прямой, а не проходит через внутренний буфер и копируется дважды. Таким образом, также нет реального недостатка.

0

Нет, если вам нужен byte[] из вашего ввода, чтобы дать вам результат, не было бы никакой пользы. Это именно то, что делают BufferedInputStream и BufferedOutputStream. Найдите соответствующий размер буфера и используйте его.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню