2010-07-29 9 views
9

Sto deserializzando un oggetto da un file che ha una dimensione di 350 KB e richiede molto tempo. La mia informatizzazione TA mi ha detto che esiste un modo per utilizzare un lettore Buffered insieme a ObjectInputStream per aumentare notevolmente le prestazioni. Tuttavia non riesco a trovare nulla su questo su Google.Esiste un oggetto ObjectInputStream con buffer?

risposta

18

Si utilizza la decorazione per memorizzare il flusso di input. Ti piace questa

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

Questo farà sì che ogni chiamata a ObjectInputStream non chiama il flusso di base in, come chiamata di sistema di file di lettura del sistema operativo. Invece, ogni chiamata va al flusso di input bufferizzato, che recupera e memorizza nella cache blocchi di dati (8K di default), e legge da quello. Questo è più veloce, dal momento che la lettura dallo stream è ora una chiamata di metodo locale in java e il metodo di chiamata overhead di una chiamata di sistema si verifica meno spesso. Anche la coerenza della cache e le ottimizzazioni JIT entrano in gioco per migliorare le prestazioni.

+0

'ObjectInputStream' utilizza un buffer 1k almeno una parte del tempo, in modo da questo suggerimento non avrà un effetto drammatico come suggerito qui. – EJP

+0

@EJP Questa soluzione sarà abbastanza efficiente per la lettura di oggetti e anche linee come il metodo 'readLine()' in 'BufferedReader'? –

2

No, ma è possibile utilizzare ObjectInputStream (InputStream in) costruttore

Per creare l'oggetto tamponata gli input flusso passando BufferedInputStream come argomento al costruttore sopra.

Ecco ad esempio per la lettura di oggetti serializzati dal file:

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(); 
    } 
} 

Checkout seguente link:

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

+0

Potrebbe volere un 'try {' dopo la riga di dichiarazione 'file', e un'} finally {file.close(); } 'invece di' in.close(); '. –

+0

Questo codice sicuramente non verrà compilato, poiché nel blocco 'finally',' file' non è dichiarato. – uckelman

+0

@uckelman Ora il codice dovrebbe essere compilato. In precedenza avevo inserito il codice di riferimento ma non ho testato/compilato lo stesso. – YoK

Problemi correlati