Возможно, вам не всегда нужна буферизация, поэтому ответ будет «Нет», в некоторых случаях это просто накладные расходы.
Есть еще одна причина, по которой это «нет», и это может быть более серьезным. BufferedInputStream
(или BufferedReader
) может привести к непредсказуемым сбоям при использовании с сетевым сокетом, когда вы также включили тайм-аут в сокете. Тайм-аут может возникать при чтении пакета. Вы больше не сможете получить доступ к данным, которые были перенесены на эту точку, даже если вы знали, что существует некоторое ненулевое количество байтов (см. java.net.SocketTimeoutException
, который является подклассом java.io.InterruptedIOException
, поэтому имеется переменная bytesTransferred
).
Если вам интересно, как может произойти тайм-аут сокета во время чтения, просто подумайте о вызове метода read(bytes[])
и исходного пакета, который содержит сообщение, которое было разделено, но один из частичных пакетов задерживается за пределами таймаута (или оставшаяся часть таймаута). Это может происходить чаще, когда снова завертывается в то, что реализует java.io.DataInput
(любое из чисел чтения для нескольких байтовых значений, например readLong()
или readFully()
или BufferedReader.readLine()
.
Обратите внимание, что java.io.DataInputStream
также является плохим кандидатом на потоки сокетов, у которых есть тайм-аут, так как он не ведет себя хорошо с исключениями тайм-аута.
Это, по-видимому, означает, что отметка и сброс являются единственными полезными вещами, которые BufferedInputStream добавляет поверх простого 'InputStream'. Это может быть справедливо с точки зрения API, но, как говорили другие, «BufferedInputStream» заботится о буферизации чтения для вас. Чтение байта по времени из голого «FileInputStream» в 40 раз медленнее, чем чтение из одного, завернутого в «BufferedInputStream». Тем не менее, верните «InputStream» и сохраните свою подпись метода как таковой. Пользователи могут обернуть, если они того пожелают. – jasonmp85
Согласен, что с точки зрения производительности лучше обернуть его в 99,9% случаев. Однако он освобождает потребителя от ответственности за то, как использовать InputStream. Подобные предположения от потребителя ограничивают возможность повторного использования. –
Я думаю, что в более чем 0,1% случаев потребитель не будет читать один байт за раз и вместо этого сам будет использовать какой-то буфер, и в этом случае BufferedInputStream будет бесполезным накладными расходами. –