【发布时间】:2010-10-25 04:11:40
【问题描述】:
假设有一个文本流(或 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:“溢出.......xyz”
如何修改此代码,以便它正确地找到跨越缓冲区边界的给定搜索字符串,但不将整个流加载到内存中?
编辑:请注意,在流中搜索字符串时,我们会尝试尽量减少从流中读取的次数(以避免网络/磁盘中的延迟) 并保持内存使用量不变,无论流中的数据量如何。 string matching algorithm 的实际效率是次要的,但很明显,找到使用其中一种更有效算法的解决方案会很好。
【问题讨论】:
标签: java algorithm string search stream