用Java读取多个文本文件

时间:2013-07-31 09:00:25

标签: java recursion readfile

我的文本文件很少。每个文本文件都包含一些路径和/或其他文件的引用。

File1中

#file#>D:/FilePath/File2.txt   
Mod1>/home/admin1/mod1
Mod2>/home/admin1/mod2


文件2

Mod3>/home/admin1/mod3
Mod4>/home/admin1/mod4

我想要的是,通过仅提供Mod1, Mod2, Mod3, Mod4作为我的java程序的输入,将所有路径File1.txt复制到另一个文本文件中。

到目前为止我做了什么?

public void readTextFile(String fileName){
        try {
            br = new BufferedReader(new FileReader(new File(fileName)));
            String line = br.readLine();

            while(line!=null){

                if(line.startsWith("#file#>")){
                    String string[] = line.split(">");
                    readTextFile(string[1]);
                }
                else if(line.contains(">")){
                    String string[] = line.split(">");                  
                    svnLinks.put(string[0], string[1]);
                }               
                line=br.readLine();
            }           
        } catch (Exception e) {         
            e.printStackTrace();
        }
    }

目前我的代码仅读取File2.txt的内容,控件不会返回File1.txt。 请询问是否需要更多输入。

3 个答案:

答案 0 :(得分:0)

看起来很简单。我们需要在填充svnLinks Map后编写您的文件,假设您现有的代码正常工作(在其中看不到任何太奇怪的东西)。

因此,一旦填充了Map,您就可以使用以下内容:

File newFile = new File("myPath/myNewFile.txt");
// TODO check file can be written
// TODO check file exists or create
FileOutputStream fos = null;
OutputStreamWriter osw = null;
BufferedWriter bw = null;
try {
    fos = new FileOutputStream(newFile);
    osw = new OutputStreamWriter(fos);
    bw = new BufferedWriter(osw);
    for (String key: svnLinks.keySet()) {
        bw.write(key.concat(" my separator ").concat(svnLinks.get(key)).concat("myNewLine"));
    }
}
catch (Throwable t) {
    // TODO handle more gracefully
    t.printStackTrace();
    if (bw != null) {
        try {
            bw.close();
        }
        catch (Throwable t) {
            t.printStackTrace();
        }
}

答案 1 :(得分:0)

首先,您在没有关闭当前阅读器的情况下跳转到另一个文件,当您回来时,您将丢失光标。首先读取一个文件,然后写入与另一个文件匹配的所有内容。关闭当前阅读器(不要关闭编写器),然后打开下一个要阅读的文件,依此类推。

答案 2 :(得分:0)

以下是您的方法的非递归实现:

public static void readTextFile(String fileName) throws IOException {

    LinkedList<String> list = new LinkedList<String>();
    list.add(fileName);
    while (!list.isEmpty()) {
        BufferedReader br = null;
        try {
            br = new BufferedReader(new FileReader(new File(list.pop())));
            String line;
            while ((line = br.readLine()) != null) {
                if (line.startsWith("#file#>")) {
                    String string[] = line.split(">");
                    list.add(string[1]);
                } else if (line.contains(">")) {
                    String string[] = line.split(">");
                    svnLinks.put(string[0], string[1]);
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            br.close();
        }
    }
}

只需使用 LinkedList 来维护订单。如果你要将文件的读数限制在一定的数量(深度),我建议你添加一些计数器。例如:

while (!list.isEmpty() && readCount < 10 )

这将消除将代码运行到无穷大的可能性(在循环引用的情况下)。