高效地在流中搜索字符串的方法

5 浏览
0 Comments

高效地在流中搜索字符串的方法

假设我有一个文本流(或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"

如何修改此代码,以便正确找到给定的搜索字符串,并跨越缓冲区的边界,但又不将整个流加载到内存中?

编辑:请注意,在搜索流中的字符串时,我们试图最小化从流中读取的次数(以避免网络/磁盘的延迟),并保持内存使用量恒定,而不管流中的数据量。实际上,字符串匹配算法的效率是次要的,但显然,如果能找到使用其中一种更有效的算法的解决方案,那将是很好的。

0