在.text中搜索字符串的更快方法

时间:2014-03-11 02:34:22

标签: java

嘿伙计们,我已经编写了这个代码,用于在txt文件中搜索字符串。 是否可以优化代码,以便以最快的方式搜索字符串。 假设文本文件很大(500MB - 1GB)

我不想使用模式匹配器。

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;


public class StringFinder {

public static void main(String[] args)
{
    double count = 0,countBuffer=0,countLine=0;
    String lineNumber = "";
    String filePath = "C:\\Users\\allen\\Desktop\\TestText.txt";
    BufferedReader br;
    String inputSearch = "are";
    String line = "";

    try {
        br = new BufferedReader(new FileReader(filePath));
        try {
            while((line = br.readLine()) != null)
            {
                countLine++;
                //System.out.println(line);
                String[] words = line.split(" ");

                for (String word : words) {
                  if (word.equals(inputSearch)) {
                    count++;
                    countBuffer++;
                  }
                }

                if(countBuffer > 0)
                {
                    countBuffer = 0;
                    lineNumber += countLine + ",";
                }

            }
            br.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    } catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    System.out.println("Times found at--"+count);
    System.out.println("Word found at--"+lineNumber);
}
}

5 个答案:

答案 0 :(得分:2)

fast string search algorithms,但很大一部分时间将从外部存储中读取文件。如果您可以提前索引文件,则可以保存读取和扫描整个文件。如果你不能,也许你至少可以避免从外部存储器读取文件,例如如果文件是从网络进入的,则先搜索它,或者不要将其写入存储。

答案 1 :(得分:1)

尝试Matcher.find,分裂很慢,因为它会创建很多对象

答案 2 :(得分:1)

如果您出于某种原因不想使用Matcher.find,那么至少要使用indexOf。

你可以检查整行,而不必将行分成许多字符串对象,然后需要迭代。

int index = line.indexOf (inputSearch);

while (index != -1)
{
    count++;
    countBuffer++;
    index = line.indexOf (inputSearch, index+1);
}

答案 3 :(得分:0)

对于普通字符串,即不是正则表达式,如果你不能使用一些复杂的引擎(Lucene或Solr想到这么大的文件)或数据库(?)来索引文件,你应该检查出Rabin-Karp algorithm。这是一个非常聪明的算法,在O(n + m)中找到一个简单的字符串匹配,其中n是文本的长度,m是搜索字符串的长度。

答案 4 :(得分:0)

您的瓶颈可能不是解析每一行所需的时间,而是读取实际文件。磁盘IO至少比通过char数组迭代慢一个数量级。但是在你对代码进行分析之前,你真的不会知道。启动VisualVM并使用它来确定您花费最多时间的地方。如果你不这样做,你只是在猜测。