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
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.
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
Może zażyczyć 'try {' po linii deklaracji 'file', a'} finally {file.close(); } 'zamiast' in.close(); '. –
Ten kod zdecydowanie nie będzie się kompilował, ponieważ w 'finally' bloku,' plik' nie jest zadeklarowany. – uckelman
@uckelman Teraz kod powinien się skompilować. Wcześniej wprowadziłem kod ref, ale nie testowałem/kompilowałem tego samego. – YoK
'ObjectInputStream' używa 1K bufor przynajmniej część czasu, więc ta propozycja nie będzie miał tak dramatycznego efektu, jak sugerowano tutaj. – EJP
@EJP Czy to rozwiązanie będzie wystarczająco wydajne do czytania obiektów, a także do linii takich jak 'readLine()' w 'BufferedReader'? –