2010-07-29 9 views
9

Ich deserialisiere ein Objekt aus einer Datei, die 350 KB groß ist, und dauert ziemlich lange. Mein Informatik-TA hat mir gesagt, dass es einen Weg gibt, einen gepufferten Reader zusammen mit dem ObjectInputStream zu verwenden, um die Leistung erheblich zu steigern. Ich kann jedoch dazu bei Google nichts finden.Gibt es einen gepufferten ObjectInputStream?

Antwort

18

Sie verwenden Dekoration, um den Eingabestream zu puffern. Gefallen Sie diesen

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

Dadurch wird sichergestellt, dass jeder Aufruf von Object ruft nicht den Basisstrom in, wie die Datei Lese-Systemaufruf OS. Stattdessen wird jeder Aufruf an den gepufferten Eingabestream übergeben, der Datenblöcke (standardmäßig 8 KB) abruft und zwischenspeichert und von diesem liest. Dies ist schneller, da das Lesen aus dem Stream jetzt ein lokaler Methodenaufruf in Java ist und der Methodenaufruf-Overhead eines Systemaufrufs weniger häufig auftritt. Cache-Kohärenz und JIT-Optimierungen spielen ebenfalls eine Rolle bei der Verbesserung der Leistung.

+0

'ObjectInputStream' verwendet ein 1k Puffer zumindest einen Teil der Zeit, so dass dieser Vorschlag wird nicht so dramatisch wirken wie hier vorgeschlagen. – EJP

+0

@EJP Wird diese Lösung effizient genug sein, um Objekte zu lesen, sowie Zeilen wie 'readLine()' Methode in 'BufferedReader' tut? –

2

Nein, aber Sie können, indem BufferedInputStream als Argument oben Konstruktor Object (Inputstream in) Konstruktor

Um gepufferte Objekt intput Stream zu erstellen verwenden.

ist hier beispielsweise für serialisierte Objekte beim Lesen von Datei:

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

Kasse folgenden Link:

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

+0

Könnte einen 'try {' nach der 'file' Deklarationszeile und ein'} finally {file.close(); } 'anstelle von' in.close(); '. –

+0

Dieser Code wird definitiv nicht kompiliert, da im 'finally' Block' Datei' nicht deklariert ist. – uckelman

+0

@uckelman Jetzt sollte Code kompilieren. Früher hatte ich Ref-Code eingegeben, aber nicht getestet/kompiliert. – YoK