Создание скользящего окна в потоке байтов в Java - PullRequest
2 голосов
/ 19 апреля 2011

У меня есть поток байтов, который входит в мое приложение (на самом деле это чтение из файла, но это может измениться).

Данные имеют форму <tag><value>.Я ищу определенный тег и хочу отбросить все остальные.

Я думал о том, чтобы иметь «окно» длины (taglength + valuelength) и вставлять в него данные, причем старые данные сбрасывались с конца.,Затем, как только первые байты (taglength) совпадают с интересующим меня тегом, я могу просто получить все окно и обработать его.

Я не думаю, что в SDK есть что-то, что соответствует моим потребностям, но я бы хотелбыть неправым.Любые идеи?

РЕДАКТИРОВАТЬ: Чтобы уточнить, данные не xml - я просто использовал угловые скобки, чтобы показать разделение.Данные на самом деле являются двоичным потоком.

Ответы [ 3 ]

0 голосов
/ 19 апреля 2011

Самым близким в JDK является использование ByteBuffer.compact (), который позволяет перетасовывать данные в буфере.Один из способов избежать слишком большого количества вызовов для сжатия - сделать буфер достаточно большим и вызывать его только тогда, когда у вас заканчивается свободное пространство.

Я бы использовал ByteBuffer, только если ваш формат данных прост, то есть не полонСтандарт XML.

0 голосов
/ 19 апреля 2011

Использовать кольцевой буфер , т.е. кольцевой буфер фиксированной длины (массив). Вы сохраняете два указателя, один указывает на начало данных (то есть самые старые байты в кольце), а другой указывает на конец данных (на самые новые байты).

Вы сканируете кольцо от начального указателя до конечного указателя. В определенные моменты времени, например, когда вы исчерпали содержимое кольца, вы читаете свежие данные в кольцо, перезаписываете старые данные, а затем корректируете указатели соответствующим образом. Поскольку это кольцо, когда вы увеличиваете указатель за конец массива, вы возвращаетесь к началу массива.

UPDATE

Пример использования кольцевого буфера в Java:
http://david.tribble.com/src/java/tribble/util/FifoQueue.java

0 голосов
/ 19 апреля 2011

Использование потока байтов для анализа XML-файла вызывает проблемы.

Я настоятельно рекомендую использовать потоковый синтаксический анализатор XML (например, SAXParser), который не буферизует весь документ в памяти (или не создаетполное представление DOM).Парсер SAX, встроенный в JDK, довольно эффективен с точки зрения использования памяти.

...