Java迭代读取文件

时间:2013-08-13 11:17:00

标签: java file loops xml-parsing directory

目前我在为公司编写工具时遇到问题。我有384个XML文件,我必须阅读并使用SAX Parser解析为txt文件。 到目前为止,我将所有XML文件解析为一个大小为43 MB的txt文件。使用BufferedReader和line.startsWith我想从文本文件中提取所有相关信息。

修改:完成 (所以我的问题是如何更有效地解决这个问题。我有一个想法(但不幸的是你没想到的代码),但我不知道它是否可能:我想迭代一个目录,找到XML文件我想要,然后解析它并用解析的内容创建一个新的txt文件。如果为所有384个XML文件做了我想要384 txt文件的相同的东西,用BufferedReader读取它们以获取我的相关信息。阅读很重要一个一个。另一个问题是目录路径,它有点复杂:“C:\ Users \ xxx \ Documents \ Data \ ProjectName \ A1 \ 1 \ 1SLin \ wanted.xml”对于每个文件都有一个自己的目录变量是A1,它从AP和1-24到达。或者我在arraylist中有绝对路径的所有相关文件,所以如果它更容易迭代这个列表也可以。)

修改 我找到了一个解决方案:下面包含搜索目录方法和一个将列表的xml文件解析到具有相同文件名但另一个文件扩展名的同一目录的方法

public List<File> searchFile(File dir, String find) {

    File[] files = dir.listFiles();
    List<File> matches = new ArrayList<File>();
    if (files != null) {
        for (int i = 0; i < files.length; i++) {
            if (files[i].isDirectory()) {
                matches.addAll(searchFile(files[i], find));
            } else if (files[i].getName().equalsIgnoreCase(find)) {
                matches.add(files[i]);
            }
        }
    }
    Collections.sort(matches);
    return matches;

}

public static void main(String[] args) throws IOException {

    Import_Files im = new Import_Files();
    File dir = new File("C:\\Users\\xxx\\Desktop\\MS-Daten\\");
    String name = "snp_result_5815.xml";
    List<File> matches = im.searchFile(dir, name);
    System.out.println(matches);

    for (int i=0; i<matches.size(); i++) {
        String j = String.valueOf(i);
        String xml_name = matches.get(i).getAbsolutePath();
        File f = new File(matches.get(i).getAbsolutePath().replaceFirst(".xml", ".txt"));
        System.setOut(new PrintStream(new FileOutputStream(f)));

        System.out.println("\nstarting File: "+ i + "\n");
        xml_parse myReader = new xml_parse(xml_name);
        myReader.setContentHandler(new MyContentHandler());
        myReader.setErrorHandler(new MyErrorHandler());
        myReader.run();
    }

}

1 个答案:

答案 0 :(得分:0)

下面的searchFolder方法将采用路径和文件扩展名,搜索路径和所有子目录,并将任何匹配的文件类型传递给processFile方法。

public static void main(String[] args) {
    String path = "c:\\temp";
    Pattern filePattern = Pattern.compile("(?i).*\\.xml$");
    searchFolder(path, filePattern);
}

public static void searchFolder(String searchPath, Pattern filePattern){
    File dir = new File(searchPath);
    for(File item : dir.listFiles()){
        if(item.isDirectory()){
            //recursively search subdirectories
            searchFolder(item.getAbsolutePath(), filePattern);
        } else if(item.isFile() && filePattern.matcher(item.getName()).matches()){
            processFile(item);
        }
    }
}

public static void processFile(File aFile){
    String filename = aFile.getAbsolutePath();
    String txtFilename = filename.substring(0, filename.lastIndexOf(".")) + ".txt";
    //Do your xml file parsing and write to txtFilename
}

路径的复杂性没有区别,只需指定要搜索的根路径(在您的案例中看起来像C:\Users\xxx\Documents\Data\ProjectName),它就会找到所有文件。