Es posible que no siempre necesite almacenamiento en búfer, por lo tanto, la respuesta sería No, en algunos casos es sólo por encima.
Hay otra razón por la que es "No" y puede ser más grave. BufferedInputStream
(o BufferedReader
) puede causar fallas impredecibles cuando se usa con un socket de red cuando también ha habilitado un tiempo de espera en el socket. El tiempo de espera puede ocurrir mientras lee un paquete. Ya no podrá acceder a los datos que se transfirieron a ese punto, incluso si sabía que había una cantidad de bytes distinta de cero (consulte java.net.SocketTimeoutException
, que es una subclase de java.io.InterruptedIOException
, por lo que tiene disponible la variable bytesTransferred
).
Si se pregunta cómo podría ocurrir un tiempo de espera de socket al leer, solo piense en llamar al método read(bytes[])
y el paquete original que contiene el mensaje terminó dividido pero uno de los paquetes parciales se retrasa más allá del tiempo de espera (o porción restante del tiempo de espera). Esto puede suceder con más frecuencia cuando se vuelve a aplicar algo que implementa java.io.DataInput
(cualquiera de las lecturas para valores de bytes múltiples, como readLong()
o readFully()
o el método BufferedReader.readLine()
).
Tenga en cuenta que java.io.DataInputStream
también es un mal candidato para las secuencias de socket que tienen un tiempo de espera ya que tampoco se comporta bien con las excepciones de tiempo de espera.
Esto parece implicar que la marca y el restablecimiento son las únicas cosas útiles que 'BufferedInputStream' agrega sobre un' InputStream' simple. Esto podría ser cierto desde un sentido de API, pero como otros han dicho, 'BufferedInputStream' se ocupa de las lecturas de almacenamiento intermedio para usted. Leer byte a tiempo desde un 'FileInputStream' desnudo es 40 veces más lento que leer uno envuelto en un' BufferedInputStream'. Dicho esto, devuelve el 'InputStream' y conserva la firma de tu método como tal. Los usuarios pueden envolver si así lo desean. – jasonmp85
Acepto que, desde el punto de vista del rendimiento, es mejor envolverlo en el 99,9% de los casos. Sin embargo, alivia al consumidor de su responsabilidad de pensar cómo usar el InputStream. Este tipo de suposiciones del consumidor limita la reutilización. –
Creo que en más de un 0.1% de los casos, el consumidor no leerá un byte a la vez y en su lugar usará algún tipo de búfer, en cuyo caso el BufferedInputStream es inútil. –