2010-07-29 4 views
9

Я десериализую объект из файла размером 350 КБ и занимаю его довольно долго. Моя компьютерная наука TA рассказала мне, что есть способ использовать Buffered reader вместе с ObjectInputStream, чтобы значительно повысить производительность. Я ничего не могу найти об этом в Google.Существует ли Buffered ObjectInputStream?

ответ

18

Вы используете украшение для буферизации входного потока. Как это

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

Это гарантирует, что каждый вызов ObjectInputStream не вызывает основной поток in, такие как системный вызов чтения файла в ОС. Вместо этого каждый вызов переходит к буферизованному входному потоку, который извлекает и кэширует блоки данных (по умолчанию 8K) и считывает с этого. Это происходит быстрее, так как чтение из потока теперь является вызовом локального метода в java, а служебные вызовы вызова метода для системного вызова встречаются реже. В улучшении производительности также играют роль согласованность кеша и оптимизация JIT.

+0

'ObjectInputStream' использует 1k буфер, по меньшей мере, часть времени, так что это предложение не будет иметь столь драматического эффекта, как предлагается здесь. – EJP

+0

@EJP Будет ли это решение достаточно эффективным для чтения объектов, а также строк типа 'readLine()' метода в 'BufferedReader'? –

2

Нет, но Вы можете использовать ObjectInputStream (InputStream в) конструктор

Чтобы создать буферизованный объект intput потока, передавая BufferedInputStream в качестве аргумента выше конструктора.

Вот пример для чтения сериализованных объектов из файла:

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 следующая ссылка:

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

+0

Может потребоваться 'try {' после строки объявления 'file' и'} finally {file.close(); } 'вместо' in.close(); '. –

+0

Этот код определенно не будет компилироваться, поскольку в блоке 'finally'' 'файл не объявлен. – uckelman

+0

@uckelman Теперь код должен компилироваться. Раньше я вводил код ref, но не тестировал и не компилировал его. – YoK

Смежные вопросы