1

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

文件 1

#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到另一个文本文件中,仅将File1.txt其作为输入提供给我的 java 程序。

到现在为止我做了什么?

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. 请询问是否需要更多输入。

4

3 回答 3

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 )

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

于 2013-07-31T12:28:26.650 回答
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();
        }
}
于 2013-07-31T09:17:59.603 回答
0

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

于 2013-07-31T09:26:37.497 回答