到目前为止我已经做到了
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 的单个文件,上述速度也非常慢。你知道如何实现我想要的吗?我没想到这会这么慢。
编辑//如果这不能通过一个简单的程序有效地完成,请随时向我提供有用的免费框架的建议。谢谢大家的帮助。
最佳答案
您的方法的问题在于您使用的正则表达式。您在模式的开头和结尾处包含 .* ,这将显着提高处理速度。使用以下正则表达式尝试相同的代码:
(MyFunc\\(.*?\\);)
您还可以应用其他答案提出的增强功能,但我很确定您的瓶颈在于正则表达式本身。
祝你好运!
关于java - 从项目中提取数据的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20058188/