Давайте предположим, что у вас есть поток текста (или 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 ......... стек»
Потоковый буфер 2: «переполнение ....... xyz»
Как я могу изменить этот код так, чтобы он правильно находил заданную строку поиска через границу буфера, но без загрузки всего потока в память?
Редактировать: Обратите внимание, что при поиске строки для потока мы пытаемся минимизировать количество операций чтения из потока (чтобы избежать задержки в сети / диске) и сохранить постоянную загрузку памяти независимо от объема данных в потоке. Фактическая эффективность алгоритма сопоставления строк является вторичной, но, очевидно, было бы неплохо найти решение, которое использовало бы один из наиболее эффективных из этих алгоритмов.