高效地在流中搜索字符串的方法
高效地在流中搜索字符串的方法
假设我有一个文本流(或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缓冲区的边界上,这种方法将无法检测到:
搜索文本:"stackoverflow"
流缓冲区1:"abc.........stack"
流缓冲区2:"overflow.......xyz"
如何修改此代码,以便正确找到给定的搜索字符串,并跨越缓冲区的边界,但又不将整个流加载到内存中?
编辑:请注意,在搜索流中的字符串时,我们试图最小化从流中读取的次数(以避免网络/磁盘的延迟),并保持内存使用量恒定,而不管流中的数据量。实际上,字符串匹配算法的效率是次要的,但显然,如果能找到使用其中一种更有效的算法的解决方案,那将是很好的。