到目前为止,我已经做到了这一点
import java.io.File;
import java.io.FileInputStream;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.apache.commons.io.IOUtils;
public class Test {
public static void main(String... args) {
Pattern p = Pattern.compile("(?s).*(MyFunc[(](?s).*[)];)+(?s).*");
File[] files = new File("C:\\TestDir").listFiles();
showFiles(files, p);
}
public static void showFiles(File[] files, Pattern p) {
for (File file : files) {
if (file.isDirectory()) {
System.out.println("Directory: " + file.getName());
showFiles(file.listFiles(), p); // Calls same method again.
} else {
System.out.println("File: " + file.getAbsolutePath());
String f;
try {
f= IOUtils.toString(new FileInputStream(file.getAbsolutePath()), "UTF-8");
System.out.println(file.getName());
Matcher m = p.matcher(f);
if (m.find()) {
System.out.println(m.group());
}
} catch (Exception e) {
e.printStackTrace();
return;
}
}
}
}
}
我想要做的是找到在某个目录中的文件中写入的每个MyFunc调用(可能包含应该检查的文件的子目录)。文件数量非常大,但即使是1Mb的单个文件,上述速度也非常慢。你知道怎么做到我想要的吗?我没想到这会这么慢。
编辑//如果一个简单的程序无法有效完成,请随时向我提供有用的免费框架。谢谢大家的帮助。
答案 0 :(得分:1)
您可能会在每个文件的内容中创建一个字符串。这会给堆和垃圾收集器带来压力。
您可以使用Scanner对象来帮助解决此问题:
http://docs.oracle.com/javase/1.5.0/docs/api/java/util/Scanner.html
此外,这已在此处得到解答:
祝你好运!
答案 1 :(得分:1)
这可能对你有所帮助:
同样,为每个文件创建一个字符串代价很高。此示例使用内存映射文件来避免垃圾收集器上的命中。这将改为使用基于C的堆而不是JVM内的内存。
答案 2 :(得分:1)
您的方法的问题是您正在使用的正则表达式。您在模式的开头和结尾处包含。*,这将大大增加处理。使用以下正则表达式尝试相同的代码:
(MyFunc\\(.*?\\);)
你也可以应用其他答案提出的增强功能,但我很确定你的瓶颈在于正则表达式。
祝你好运!