查找文件中是否存在字符串的最佳方法

时间:2017-05-08 04:58:11

标签: java string file

我有一个包含数千行的文本文件。查找文件中是否存在某个字符串的最佳方法是什么?

将整个文件读入字符串&然后使用string.contains方法或使用Files.readAllLines方法&创建所有行的列表然后循环遍历列表中的每一行&检查该行是否包含所需的字符串?

更新:我使用的是Java 7.搜索限制为每个文件1-2个字符串搜索(10个文件)。要搜索的字符串随文件而变化。如果找到字符串,我想停止搜索。

2 个答案:

答案 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;
    }

});