Supposons qu'un flux de texte (ou d'un Lecteur en Java) que je voudrais pour rechercher une chaîne de caractères particulière. Le flux de texte peut être très grande, de sorte que dès que la chaîne de recherche est trouvé que j'aimerais retourner true et aussi essayer d'éviter le stockage de l'ensemble de l'entrée dans la mémoire.
Naïvement, je pourrais essayer de faire quelque chose comme ceci (en 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;
}
Bien sûr, cela ne parvient pas à détecter la chaîne de recherche donnée, si elle se produit à la limite de l'1k de mémoire tampon:
Texte recherché: "stackoverflow"
Mémoire tampon du flux 1: "abc.........la pile"
De la mémoire tampon 2: "dépassement de capacité.......xyz"
Comment puis-je modifier ce code pour qu'il soit correctement trouve la chaîne de recherche-delà de la limite de la mémoire tampon, mais sans charger la totalité du flux de données en mémoire?
Edit: Remarque lors de la recherche d'un flux de données pour une chaîne de caractères, nous essayons de minimiser le nombre de lectures à partir du flux (pour éviter la latence dans un réseau/disque) et de garder l'utilisation de la mémoire constante quelle que soit la quantité de données dans le flux. Réelle efficacité de la chaîne de l'algorithme de mise en correspondance est secondaire, mais bien évidemment, il serait agréable de trouver une solution qui utilisaient un des plus efficace de ces algorithmes.