Если я имею дело с файлами, я обычно обертываю 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
? Я не совсем уверен, как эти классы работают под капотом, и я не знаю, будет ли у них преимущество в использовании этой ситуации.
Благодарю.
В общем случае нет, но если вы используете буфер, размер которого не равен двум, может быть полезно иметь считывание и запись power-of-2-aligned с помощью BufferedInputStream
или BufferedOutputStream
, размер буфера по умолчанию которого равен 8192 байта. Буферы в идеале должны быть кратными размеру блока файловой системы или, тем более, размер кластера.
Следует отметить, что оба этих потока имеют смазанные пути, когда передача больше, чем внутренний буфер: внутренний буфер опустошен, а оставшаяся часть передачи является прямой, а не проходит через внутренний буфер и копируется дважды. Таким образом, также нет реального недостатка.
Нет, если вам нужен byte[]
из вашего ввода, чтобы дать вам результат, не было бы никакой пользы. Это именно то, что делают BufferedInputStream
и BufferedOutputStream
. Найдите соответствующий размер буфера и используйте его.