我有一个包含数千行的文本文件。查找文件中是否存在某个字符串的最佳方法是什么?
将整个文件读入字符串&然后使用string.contains
方法或使用Files.readAllLines
方法&创建所有行的列表然后循环遍历列表中的每一行&检查该行是否包含所需的字符串?
更新:我使用的是Java 7.搜索限制为每个文件1-2个字符串搜索(10个文件)。要搜索的字符串随文件而变化。如果找到字符串,我想停止搜索。
答案 0 :(得分:3)
考虑到您使用Java 8并且文件大小很大,最好使用Streams API。可能有两种情况:一种情况是您找到包含要返回的$REQUEST_URI = $_SERVER ['REQUEST_URI'];
$URI_COLL = explode ( '/', $REQUEST_URI );
$REQUEST_URI = $URI_COLL [1];
$filepath = dirname ( dirname ( dirname ( __FILE__ ) ) ) .'/'. $REQUEST_URI. "/configXML.xml" ;
$found = file_exists ( $filepath );
的行,或者您想要浏览所有寻找stringToSearch
的行。示例代码如下:
stringToSearch
因此阅读文件的所有行似乎是一个坏主意。最好逐行阅读。如果您有兴趣了解最快的字符串搜索算法,请查看this链接。
答案 1 :(得分:0)
将行保留在列表中几乎没有什么好处。不过,你提出的两种方法都会受到同样的警告。
如果您只关心文件中的特定行,您可能不希望在内存中保留不需要的行。如果您使用的是Java 8,则可以使用Files.lines()
逐行读取文件。否则,番石榴LineProcessor
也可以这样做。
此示例使用流来查找与字符串匹配的所有行,并将它们返回到列表中。
List<String> lines = Files.lines(path)
// findFirst() can be used get get the first match and stop.
.filter(line -> line.contains("foo"))
.collect(Collectors.toList());
这个是用番石榴做的。
import com.google.common.io.Files;
import com.google.common.io.LineProcessor;
List<String> lines = Files.readLines(file, new LineProcessor<List<String>>() {
private List<String> lines = new ArrayList<>();
@Override
public boolean processLine(String line) throws IOException {
if (line.contains("foo"))
lines.add(line);
return true; // return false to stop
}
@Override
public List<String> getResult() {
return lines;
}
});