Я десериализую объект из файла размером 350 КБ и занимаю его довольно долго. Моя компьютерная наука TA рассказала мне, что есть способ использовать Buffered reader вместе с ObjectInputStream, чтобы значительно повысить производительность. Я ничего не могу найти об этом в Google.Существует ли Buffered ObjectInputStream?
ответ
Вы используете украшение для буферизации входного потока. Как это
InputStream in = ...; // your underlying stream (e.g. FileInputStream)
ObjectInputStream oin = new ObjectInputStream(new BufferedInputStream(in));
Это гарантирует, что каждый вызов ObjectInputStream не вызывает основной поток in
, такие как системный вызов чтения файла в ОС. Вместо этого каждый вызов переходит к буферизованному входному потоку, который извлекает и кэширует блоки данных (по умолчанию 8K) и считывает с этого. Это происходит быстрее, так как чтение из потока теперь является вызовом локального метода в java, а служебные вызовы вызова метода для системного вызова встречаются реже. В улучшении производительности также играют роль согласованность кеша и оптимизация JIT.
Нет, но Вы можете использовать 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
Может потребоваться 'try {' после строки объявления 'file' и'} finally {file.close(); } 'вместо' in.close(); '. –
Этот код определенно не будет компилироваться, поскольку в блоке 'finally'' 'файл не объявлен. – uckelman
@uckelman Теперь код должен компилироваться. Раньше я вводил код ref, но не тестировал и не компилировал его. – YoK
- 1. Поведение ObjectInputStream (Android), если объект не существует
- 2. ObjectInputStream
- 3. Line Buffered Cat
- 4. FileStream.Seek vs. Buffered Reading
- 5. .NET buffered sql read
- 6. Ошибка ObjectInputStream
- 7. GDI + Offscreen Buffered Scrolling
- 8. nginx non buffered cache
- 9. Текстовый файл Buffered Reader
- 10. Skew Buffered Image java
- 11. Java Buffered Writer
- 12. Buffered Reader и Filepaths - Easy
- 13. ObjectInputStream: StreamCorruptedException
- 14. ObjectInputStream исключение
- 15. Ошибка при использовании Buffered Reader
- 16. Не следует ли ObjectInputStream расширять FilterInputStream?
- 17. EOFException из конструктора ObjectInputStream
- 18. Определить, существует ли файл
- 19. ObjectInputStream и тайм-аут сокета
- 20. ObjectInputStream Обработка классаNotFoundException
- 21. ObjectInputStream read Array
- 22. ObjectInputStream и ObjectOutputStream
- 23. objectinputstream available() возвращает 0
- 24. StreamCorruptedException в ObjectInputStream
- 25. Получение объекта через ObjectInputStream
- 26. Android ClassNotFoundException с ObjectInputStream
- 27. unix command 'tail' lost option '-line-buffered'
- 28. ObjectInputStream не инициализируется
- 29. ObjectInputStream throwing NotSerializableException
- 30. ObjectOutputStream/ObjectInputStream с сокетами
'ObjectInputStream' использует 1k буфер, по меньшей мере, часть времени, так что это предложение не будет иметь столь драматического эффекта, как предлагается здесь. – EJP
@EJP Будет ли это решение достаточно эффективным для чтения объектов, а также строк типа 'readLine()' метода в 'BufferedReader'? –