|
|
|
Побайтовое чтение файла с одновременным парсингом
|
|||
|---|---|---|---|
|
#18+
Только начал разбираться с файловыми операциями в Java. Используется JDK 7. Требуется побайтовое сканирование файла с возможностью произвольного позиционирования. Попробовал сделать через "новомодное" nio2 и соответственно FileChannel. Возник вопрос: Можно ли обеспечить буферизацию чтения без ручной работы с ByteBuffer и восстановления position? Т.е. чтобы "давать команду" на чтение только 1 байта и после его анализа остановить работу и соответственно сохранить это положение в канале? понятно что можно читать по N байт и когда надо переставлять обратно position. Но есть ли более красивое решение? Или я вообще зря через nio использую и надо "быть проще" и пользоваться разными InputStream, RandomAccessFile и т.п.? Файлы достаточно большие для побайтового сканирования (десятки Мб) и соответственно буферизация критична. Подобная операция на другом языке программирования делалась через буферезированный FileStream. Тем самым решалась задача сохранения данных в буфере между вызовами функции анализа входных байт (все максимально скрыто от разработчика). Но вроде как теперь в Java все от nio млеют :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.11.2013, 18:50:37 |
|
||
|
Побайтовое чтение файла с одновременным парсингом
|
|||
|---|---|---|---|
|
#18+
new BufferedInputStream( NIOInputStream ) ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.11.2013, 18:55:13 |
|
||
|
Побайтовое чтение файла с одновременным парсингом
|
|||
|---|---|---|---|
|
#18+
NIOInputStream можно скопипастить из org.apache.activemq.transport.nio Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.11.2013, 18:57:33 |
|
||
|
Побайтовое чтение файла с одновременным парсингом
|
|||
|---|---|---|---|
|
#18+
ЛагманNIOInputStream можно скопипастить из org.apache.activemq.transport.nio Да, спасибо за информацию. Но как реализовать это руками в общем и так понятно было. Меня скорее интересовало, есть ли что-то такое готовое в стандартных библиотеках. Немного удивился с одной стороны большому разнообразию классов, с другой стороны отсутствию (казалось бы) простых очевидных манипуляция с потоками (к которым привык в другом языке... конкретно в Delphi... просто идет переписывание части кода на Java). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.11.2013, 19:11:46 |
|
||
|
Побайтовое чтение файла с одновременным парсингом
|
|||
|---|---|---|---|
|
#18+
Хотя все же что там с произвольным позиционированием при использовании приведенного примера вперед/назад по потоку? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.11.2013, 19:15:05 |
|
||
|
Побайтовое чтение файла с одновременным парсингом
|
|||
|---|---|---|---|
|
#18+
Вообще смысл использовать NIO с FileInputStream именно в буферизации известного количества данных, не думаю что есть смысл использовать что-то помимо BufferedInputStream( FileInputStream ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.11.2013, 19:18:26 |
|
||
|
Побайтовое чтение файла с одновременным парсингом
|
|||
|---|---|---|---|
|
#18+
_newcomer_, тебе не нужно ничего ломать. Начиная с шестых-седьмых версий обычный RandomAccessFile и FileInputStream включает в себя зависимости от sun.nio.ch.FileChannelImpl. Так что имеет смысл просто написать концептуальный код а потом уже смотреть в узкие места. И лучше определиться с типом задачи. Если это парсинг текста (в однобайтной кодировке) - то подход один. Если там надо работать блочно - и данные не являются текстом то подход другой. Самая лучшая оптимизация - это правильное ТЗ. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.11.2013, 19:19:24 |
|
||
|
Побайтовое чтение файла с одновременным парсингом
|
|||
|---|---|---|---|
|
#18+
maytonИ лучше определиться с типом задачи...Самая лучшая оптимизация - это правильное ТЗ. Идет разбор бинарного файла специализированного формата в котором встречаются различные "разделители" по которым парсинг временно прерывается. Каких-то фиксированных по размеру блоков нет. Если необходимость обработать тем или иным способом последовательность байт произвольной длины (от 2х байт до 2 Кб), пока не найден разделитель (может состоять не из одного байта). Время от времени нужно в потоке "возвращаться назад" (да и вообще случаются "прыжки" во все направления). На сколько я понимаю у FileInputStream проблема с возвратом назад. А про RandomAccessFile я не в курсе, может ли он быть буферизованым. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.11.2013, 19:25:28 |
|
||
|
Побайтовое чтение файла с одновременным парсингом
|
|||
|---|---|---|---|
|
#18+
_newcomer_На сколько я понимаю у FileInputStream проблема с возвратом назад. Да он не ходит назад. Это идея преемственности для работы с сокетами, консольным выводом, PIPEs и многое другое. Есть надстройки которые обёртывают FileInputStream и позволяют читать взад но это считается антипаттерном. Идея единоразового чтения считается ТруЪ-кодингом и рациональным подходом к ресурсам и заложена также в некоторых технологиях БД (Курсоры в Oracle ходят только вперёд). А про RandomAccessFile я не в курсе, может ли он быть буферизованым. Он блочный. В идеале вы должны читать кусками кратными сектору (512 bytes - 1K) или какому-то юниту кратному или удобному для disk volume или LUN. Читаете побайто. Но из блоков. С разумным подходом можно вести список LRU (как описано тут http://www.javaspecialist.ru/2012/02/java-lru-cache.html) прочитанных блоков и если будет прыжок назад то вместо диска с большой вероятностью 80-97% мы попадаем в кеш LRU. Можно еще попробовать такой паттерн как http://docs.oracle.com/javase/7/docs/api/java/nio/MappedByteBuffer.html. Здесь ничего не скажу т.к. практически его не использовал. Но может быть очень полезен. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.11.2013, 19:49:18 |
|
||
|
Побайтовое чтение файла с одновременным парсингом
|
|||
|---|---|---|---|
|
#18+
Спасибо, посмотрю ссылки. Что касается идеологии и преемственности - тут как всегда проблема универсализации. Если хочется иметь суперуниверсальный механизм (за счет чего он ограничен в выразительных средствах), то пусть тогда будет альтернатива для более узкого класса задач. Вроде как тут NIO в помощь. Но как-то со встроенной буферизацией непонятно. Возвращаясь к потокам - есть же реализации для файлов и памяти, которым не противопоказано произвольное позиционирование, а его нет. В конце концов операция seek для файлов есть на любых ОС и практически во всех языках программирования. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.11.2013, 20:08:03 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=38474821&tid=2128145]: |
0ms |
get settings: |
7ms |
get forum list: |
13ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
181ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
44ms |
get tp. blocked users: |
1ms |
| others: | 214ms |
| total: | 475ms |

| 0 / 0 |
