2010-07-29 15 views
9

Deserializo un objeto de un archivo que tiene un tamaño de 350 KB y lleva bastante tiempo. Mi TA de informática me dijo que hay una forma de usar un lector de almacenamiento intermedio junto con ObjectInputStream para aumentar el rendimiento. Sin embargo, no puedo encontrar nada sobre esto en Google.¿Existe un ObjectInputStream almacenado en búfer?

Respuesta

18

Utiliza la decoración para proteger la secuencia de entrada. Al igual que este

InputStream in = ...; // your underlying stream (e.g. FileInputStream) 
    ObjectInputStream oin = new ObjectInputStream(new BufferedInputStream(in)); 

Esto asegurará que cada llamada a ObjectInputStream no llama la corriente de base in, tales como llamada al sistema de archivos de lectura del sistema operativo. En cambio, cada llamada va a la secuencia de entrada almacenada en el búfer, que capta y almacena en caché los bloques de datos (8K por defecto), y lee de eso. Esto es más rápido, ya que la lectura de la secuencia ahora es una llamada a un método local en Java, y la sobrecarga de llamada a un método de una llamada al sistema se encuentra con menos frecuencia. La coherencia de caché y las optimizaciones de JIT también entran en juego para mejorar el rendimiento.

+0

'ObjectInputStream' utiliza un buffer de 1k al menos parte del tiempo, por lo que esta sugerencia no tendrá un efecto tan dramático como se sugiere aquí. – EJP

+0

@EJP ¿Esta solución será lo suficientemente eficiente para leer Objetos y líneas como el método 'readLine()' en 'BufferedReader'? –

2

Sin embargo, usted puede utilizar ObjectInputStream (InputStream in) constructor

Para crear el objeto tamponada insumo de factor corriente que pasa por BufferedInputStream como argumento del constructor anteriormente.

Aquí es ejemplo para la lectura de los objetos serializados de archivo:

InputStream file = null; 
try { 
    file = new FileInputStream("Out.test"); 
    InputStream buffer = new BufferedInputStream(file); 
    ObjectInputStream in = new ObjectInputStream(buffer); 
    vector = (Vector)in.readObject(); 
} catch (Exception e) { 
    e.printStackTrace(); 
} finally{ 
    if(file != null) { 
     file.close(); 
    } 
} 

Pedido siguiente enlace:

http://java.sun.com/docs/books/performance/1st_edition/html/JPIOPerformance.fm.html

+0

Podría querer un 'try {' después de la línea de declaración 'file', y un'} finally {file.close(); } 'en lugar de' in.close(); '. –

+0

Este código definitivamente no compilará, ya que en el bloque 'finally',' file' no está declarado. – uckelman

+0

@uckelman Ahora el código debería compilarse. Anteriormente había ingresado el código de ref, pero no lo probé/compilé. – YoK

Cuestiones relacionadas