1

テキストファイルがほとんどありません。各テキスト ファイルには、他のファイルのパスや参照が含まれています。

ファイル1

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


ファイル2

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

私が望むのは、Java プログラムへの入力としてMod1, Mod2, Mod3, Mod4のみ提供することによって、すべてのパスを別のテキスト ファイルにコピーすることだけです。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。さらに入力が必要かどうか尋ねてください。

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

まず、現在のリーダーを閉じずに別のファイルにジャンプしていて、戻ってきたときにカーソルが失われます。最初に 1 つのファイルを読み取ってから、一致するすべての内容を別のファイルに書き込みます。現在のリーダーを閉じて (ライターを閉じないでください)、次に読み取るファイルを開きます。

于 2013-07-31T09:26:37.497 に答える
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 に答える