Этот ответ применялся к первоначальной версии вопроса, где ключом было чтение потока только настолько, насколько это необходимо для сопоставления со строкой, если эта строка присутствовала. Это решение не будет соответствовать требованию гарантировать фиксированное использование памяти, но, возможно, стоит подумать, если вы нашли этот вопрос и не связаны этим ограничением.
Если вы ограничены ограничением использования постоянной памяти, Java хранит массивы любого типа в куче, и, таким образом, обнуление ссылки не освобождает память никоим образом; Я думаю, что любое решение, включающее массивы в цикле, потребляет память в куче и требует GC.
Для простой реализации, возможно, * 5 * * Сканер Java 5, который может принимать InputStream и использовать java.util.regex.Pattern для поиска входных данных, может избавить вас от беспокойства о реализации подробности.
Вот пример потенциальной реализации:
public boolean streamContainsString(Reader reader, String searchString)
throws IOException {
Scanner streamScanner = new Scanner(reader);
if (streamScanner.findWithinHorizon(searchString, 0) != null) {
return true;
} else {
return false;
}
}
Я думаю, что это регулярное выражение, потому что это звучит как работа для автомата с конечным состоянием, который начинается в начальном состоянии, меняется состояние за символом, пока не отклонит строку (без совпадения) или не перейдет в состояние принятия.
Я думаю, что это, вероятно, самая эффективная логика сопоставления, которую вы могли использовать, и то, как вы организуете чтение информации, может быть отделено от логики сопоставления для настройки производительности.
Это также, как работают регулярные выражения.