2012-03-05 9 views
5

Actualmente estoy utilizando secuencias almacenadas para leer algunos archivos. En el medio realizo un procesamiento matemático donde un símbolo es un byte.Rendimiento de DataInputStream DataOutputStream

Para leer:

InputStream input = new FileInputStream(outputname) 
input.read(byte[] b,int off,int len) 

a escribir:

OutputStream output = new BufferedOutputStream(
          new FileOutputStream(outputname), 
          OUTPUTBUFFERSIZE 
         ) 
output.write((byte)byteinsideaint); 

Ahora tengo que añadir algunos datos de cabecera, y para apoyar a los símbolos cortos también. Quiero utilizar DataInputStream y DataOutputStream para evitar convertir otros tipos a bytes y me pregunto si cuál es su rendimiento.

¿Es necesario utilizar

OutputStream output = new DataOutputStream(
          new BufferedOutputStream(
            new FileOutputStream(outputname), 
            OUTPUTBUFFERSIZE 
          ) 
         ); 

para mantener las ventajas del almacenamiento temporal de datos o que es lo suficientemente bueno para usar

OutputStream output = new DataOutputStream(
          new FileOutputStream(outputname) 
         ) 

Respuesta

7

Debe añadir BufferedOutputStream en el medio. DataOutputStream no implementa ningún almacenamiento en caché (lo que es bueno: separación de problemas) y su rendimiento será muy pobre sin almacenar en caché el OutputStream subyacente. Incluso los métodos más simples como writeInt() pueden dar como resultado cuatro escrituras de disco separadas.

Por lo que puedo ver, solo write(byte[], int, int) y writeUTF(String) están escribiendo datos en un solo fragmento byte[]. Otros escriben valores primitivos (como int o double) byte a byte.

+0

Esto me ayudó por completo. Gracias ^^ – Lake

1

Es absolutamente necesario el BufferedOutputStream en el medio.

aprecio su preocupación por el rendimiento, y tengo 2 sugerencias:

  1. reducir sus corrientes con la compresión de Java. El artículo útil se puede encontrar here.
  2. Usa la composición en lugar de la herencia (que es la práctica recomendada de todos modos). Cree un conducto que contenga un PipedInputStream y un PipedOutputStream conectados entre sí, con los métodos getInputStream() y getOutputStream(). No puede pasar directamente el objeto Pipe a algo que necesita un flujo, pero puede pasar el valor de retorno de su get métodos para hacerlo.
+0

Gracias. Por los requisitos de mi tarea, no debo comprimir fuerte – UmNyobe

+0

GZip * Sin embargo, Stream tiene enormes problemas en Java, ya que usa mucha memoria a través de llamadas nativas. LZ-4 es probablemente mejor. – claj

Cuestiones relacionadas