Существует вопрос, о котором я давно задавался вопросом, и я надеялся, что кто-то сможет дать мне ответ, чтобы успокоить мой разум.Данные буферизации для разделенных разделителями блоков
Предположим, что у меня есть входной поток (например, файл/сокет/труба) и вы хотите разобрать входящие данные. Предположим, что каждый блок входящих данных разделяется новой строкой, как и большинство обычных интернет-протоколов. Это приложение также может анализировать html, xml или любую другую интеллектуальную структуру данных. Дело в том, что данные разбиваются на логические блоки с помощью ограничителя, а не фиксированной длины. Как я могу буферизировать данные, чтобы дождаться появления разделителя?
Ответ кажется достаточно простым: достаточно иметь достаточно большой байт/массив символов, чтобы соответствовать всему.
Но что, если разделитель приходит после заполнения буфера? На самом деле это вопрос о том, как подогнать динамический блок данных в блок фиксированного размера. Я могу только подумать о нескольких альтернативах:
Увеличить размер буфера, если это необходимо. Это может потребовать значительного перераспределения памяти и может привести к исчерпанию ресурсов из специально созданных потоков (или, возможно, даже к отказу в обслуживании в случае сокетов, где мы хотим защитить себя от атак истощения и сбросить соединения, которые пытаются исчерпать ресурсы ... и злоумышленник начинает отправлять поддельные, негабаритные пакеты для запуска защиты).
Начните переписывать старые данные с помощью кругового буфера. Возможно, это не идеальный метод, так как логический блок станет неполным.
Дамп новых данных, когда буфер заполнен. Однако таким образом разделитель никогда не будет найден, поэтому этот выбор, очевидно, не является хорошим вариантом.
Просто сделать буфер фиксированного размера чертовски большим и принимать все входящие логические блоки данных, в пределах своих границ ... и если она когда-либо заполняет, просто интерпретировать весь буфер как логический блок ...
В любом случае я считаю, что мы должны предположить, что логические блоки никогда не превысят определенного размера ...
Любые мысли по этой теме? Очевидно, что должен существовать способ, поскольку языки более высокого уровня предлагают какие-то буферизующие механизмы с их потоковыми методами readLine()
.
Есть ли какой-либо «лучший способ» решить этот вопрос или всегда есть компромисс? Я очень ценю все мысли и идеи по этой теме, так как этот вопрос преследует меня каждый раз, когда мне нужно написать какой-то парсер.