2010-07-29 4 views
9

Mam deserialised obiekt z pliku, który jest 350KB rozmiar, i jego trwające raczej długo. Mój informatyk TA powiedział mi, że istnieje sposób na wykorzystanie zbuforowanego czytnika wraz z ObjectInputStream, aby znacznie zwiększyć wydajność. Nie mogę jednak znaleźć nic na ten temat w Google.Czy istnieje buforowany obiekt ObjectInputStream?

Odpowiedz

18

Dekorowanie służy do buforowania strumienia wejściowego. Podoba Ci się to

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

Zapewni to, że każde wywołanie ObjectInputStream nie wymaga strumienia bazowego in, takich jak odczytać pliku wywołania systemowego OS za. Zamiast tego każde wywołanie przechodzi do buforowanego strumienia wejściowego, który pobiera i buforuje bloki danych (domyślnie 8K) i odczytuje z tego. Jest to szybsze, ponieważ odczyt ze strumienia jest teraz wywoływaniem metody lokalnej w języku Java, a narzut wywołania metody wywołania systemowego jest rzadziej spotykany. Kompaktowość pamięci podręcznej i optymalizacje JIT również wpływają na poprawę wydajności.

+0

'ObjectInputStream' używa 1K bufor przynajmniej część czasu, więc ta propozycja nie będzie miał tak dramatycznego efektu, jak sugerowano tutaj. – EJP

+0

@EJP Czy to rozwiązanie będzie wystarczająco wydajne do czytania obiektów, a także do linii takich jak 'readLine()' w 'BufferedReader'? –

2

No ale można użyć ObjectInputStream (InputStream in) konstruktor

Aby utworzyć buforowany obiekt intput strumienia przez przepuszczanie BufferedInputStream jako argument do powyższego konstruktora.

Oto przykład do czytania odcinkach obiektów z pliku:

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

Zamówienie poniższego linku:

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

+0

Może zażyczyć 'try {' po linii deklaracji 'file', a'} finally {file.close(); } 'zamiast' in.close(); '. –

+0

Ten kod zdecydowanie nie będzie się kompilował, ponieważ w 'finally' bloku,' plik' nie jest zadeklarowany. – uckelman

+0

@uckelman Teraz kod powinien się skompilować. Wcześniej wprowadziłem kod ref, ale nie testowałem/kompilowałem tego samego. – YoK