嘿伙计们,我已经编写了这个代码,用于在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);
}
}
答案 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并使用它来确定您花费最多时间的地方。如果你不这样做,你只是在猜测。