从项目中提取数据的最佳方式

时间:2013-11-18 21:21:31

标签: 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的单个文件,上述速度也非常慢。你知道怎么做到我想要的吗?我没想到这会这么慢。

编辑//如果一个简单的程序无法有效完成,请随时向我提供有用的免费框架。谢谢大家的帮助。

3 个答案:

答案 0 :(得分:1)

您可能会在每个文件的内容中创建一个字符串。这会给堆和垃圾收集器带来压力。

您可以使用Scanner对象来帮助解决此问题:

http://docs.oracle.com/javase/1.5.0/docs/api/java/util/Scanner.html

此外,这已在此处得到解答:

Performing regex on a stream

祝你好运!

答案 1 :(得分:1)

这可能对你有所帮助:

http://www.java-tips.org/java-se-tips/java.util.regex/how-to-apply-regular-expressions-on-the-contents-of-a.html

同样,为每个文件创建一个字符串代价很高。此示例使用内存映射文件来避免垃圾收集器上的命中。这将改为使用基于C的堆而不是JVM内的内存。

答案 2 :(得分:1)

您的方法的问题是您正在使用的正则表达式。您在模式的开头和结尾处包含。*,这将大大增加处理。使用以下正则表达式尝试相同的代码:

(MyFunc\\(.*?\\);)

你也可以应用其他答案提出的增强功能,但我很确定你的瓶颈在于正则表达式。

祝你好运!

相关问题