在流中搜索字符串的有效方法
让我们假设有一个文本流(或Java中的Reader),我想检查一个特定的字符串。文本流可能非常大,因此一旦找到搜索字符串,我就希望返回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 缓冲区的边界上,则无法检测到它:
搜索文本:“堆栈溢出”
流缓冲区 1:“abc.........堆栈“
流缓冲区 2:”溢出.......xyz”
如何修改此代码,以便它能够跨缓冲区边界正确找到给定的搜索字符串,而无需将整个流加载到内存中?
编辑:请注意,在流中搜索字符串时,我们会尝试最大程度地减少从流中读取的次数(以避免网络/磁盘中的延迟),并保持内存使用量不变,而不管流中的数据量如何。字符串匹配算法的实际效率是次要的,但显然,找到一个使用其中一种更有效的算法的解决方案会很好。