2009-04-10 30 views
11

Quiero leer cada línea de un archivo de texto y almacenarlas en una ArrayList (cada línea es una entrada en ArrayList).Debo usar DataInputStream o BufferedInputStream

Hasta ahora entiendo que un BufferedInputStream escribe en el búfer y solo lee otro una vez que el búfer está vacío, lo que minimiza o al menos reduce la cantidad de operaciones del sistema operativo.

¿Estoy en lo cierto? ¿Tengo sentido?

Si lo anterior es el caso en qué situaciones alguien quisiera utilizar DataInputStream. Y, finalmente, ¿cuál de los dos debería usar y por qué? O no importa.

+0

¿Qué te hace pensar que son intercambiables? – Raedwald

Respuesta

15

uso normal InputStream (por ejemplo FileInputStream) envuelto en una InputStreamReader y luego envuelto en una BufferedReader - a continuación, llamar readLine en la BufferedReader.

DataInputStream es bueno para las primitivas de lectura, las cadenas de longitud prefijada etc.

2

Yo estaría a favor de usar Jakarta Commons IO y el método (de cualquier variedad) readlines().

Se ocupará del almacenamiento en búfer/cierre, etc. y le devolverá una lista de líneas de texto. Con gusto enrollaré mi propio flujo de entrada con buffering, etc., pero nueve de cada diez cosas de Commons IO funcionan bien y es suficiente/más conciso/menos propenso a errores, etc.

6

Las dos clases no son mutuamente excluyentes - puedes usar ambos si tus necesidades son adecuadas.

Cuando recogió, BufferedInputStream trata sobre la lectura en bloques de datos en lugar de un solo byte a la vez. También proporciona el método práctico de readLine(). Sin embargo, también se usa para buscar datos en la secuencia y luego regresar a una parte anterior de la transmisión si es necesario (consulte los métodos de marcar() y restablecer()).

DataInputStream/DataOutputStream proporciona métodos de conveniencia para leer/escribir ciertos tipos de datos. Por ejemplo, tiene un método para escribir/leer una cadena UTF. Si tuviera que hacer esto usted mismo, tendría que decidir cómo determinar el final de la Cadena (es decir, con un byte terminador o especificando la longitud de la cadena).

Esto es diferente de readLine() de BufferedInputStream que, como suena el método, solo devuelve una sola línea. writeUTF()/readUTF() tratan con cadenas: esa cadena puede tener tantas líneas como quiera.

BufferedInputStream es adecuado para la mayoría de los procesos de texto. Si está haciendo algo especial, como tratar de serializar los campos de una clase en un archivo, querrá utilizar DataInput/OutputStream, ya que ofrece un mayor control de los datos a nivel binario.

Espero que ayude.

+3

Está confundiendo un BufferedInputStream con un BufferedReader. InputStreams no tiene ningún concepto de línea, por lo que no tiene readLine() –

+0

Whoops - ¡sí, tienes razón! – Mike

2

Debe usar DataInputStream en los casos en que necesite interpretar los tipos primitivos en un archivo escrito por un lenguaje que no sea Java, de manera independiente de la plataforma.

3

Siempre se puede usar tanto:

final InputStream inputStream = ...; 
final BufferedInputStream bufferedInputStream = 
     new BufferedInputStream(inputStream); 
final DataInputStream dataInputStream = 
     new DataInputStream(bufferedInputStream); 
+0

¿Puedes explicar esto un poco en detalle? ¿Por qué usarlos de esta manera? –

+2

'DataInputStream' no almacena en búfer la entrada,' BufferedInputStream' sí (obviamente). Envolviendo 'InputStream' con' BufferedInputStream', luego envolviendo 'BufferedInputStream' con' DataInputStream', obtienes un flujo de entrada con el que es más fácil trabajar (los métodos de conveniencia 'DataInputStream' son útiles) y están respaldados por un lector tamponado, haciendo E/S más eficiente. –

4

InputStream: Clase base para leer bytes de la corriente (red o archivo), proporcionar capacidad de leer bytes de la corriente y elimine el final de la secuencia.

DataInputStream: Leer los datos directamente como un tipo de datos primitivo.

BufferInputStream: Lea los datos del flujo de entrada y use el búfer para optimizar la velocidad de acceso a los datos.

Cuestiones relacionadas