java - 从项目中提取数据的最佳方法

标签 java regex file iterator directory

到目前为止我已经做到了

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/

相关文章:

file - 编写大型文件管理脚本的最佳语言

java删除dynamodb中的所有项目

javascript - 所有数字但不包括零的正则表达式

java - 从 eclipse 提交 hadoop 作业时出现 ConnectException

php - 正则表达式匹配得太早

Python - 提取同一定界符的多个实例之间的行

java - 是否可以将对象存储到 Java 中的属性文件?

C - 写入文件的字符出现次数

java - maven可执行jar找不到资源

java - 如何分割所需格式的字符串?