Предположим, что есть поток текста (или Reader на Java), который я хотел бы проверить для конкретной строки. Поток текста может быть очень большим, поэтому, как только будет найдена строка поиска, я хотел бы вернуть true, а также попытаться избежать сохранения всего ввода в памяти.
Наивно, я мог бы попытаться сделать что-то вроде этого (в Java):
public boolean streamContainsString(Reader reader, String searchString) throws IOException {
char[] buffer = new char[1024];
int numCharsRead;
while((numCharsRead = reader.read(buffer)) > 0) {
if ((new String(buffer, 0, numCharsRead)).indexOf(searchString) >= 0)
return true;
}
return false;
}
Конечно, это не может обнаружить данную строку поиска, если она встречается на границе 1k-буфера:
Текст поиска: "stackoverflow"
Буфер потока 1: "abc......... stack"
Буфер потока 2: "переполнение....... xyz"
Как я могу изменить этот код так, чтобы он правильно находил заданную строку поиска по границе буфера, но без загрузки всего потока в память?
Изменить: Обратите внимание, что при поиске потока для строки мы пытаемся минимизировать количество чтений из потока (чтобы избежать латентности в сети/диске ) и сохранить постоянную память независимо от объема данных в потоке. Фактическая эффективность алгоритма является вторичной, но, очевидно, было бы неплохо найти решение, которое использовало бы один из наиболее эффективных из этих алгоритмов.