2

ディレクトリ内のすべてのテキスト ファイルの名前を取得しようとしています。ディレクトリにサブディレクトリがある場合は、それらのテキスト ファイルも取得したいと考えています。任意の数のサブディレクトリに対してプロセスを続行する方法がわかりません。

現在、以下のコードは、現在のディレクトリとディレクトリ内のサブディレクトリ内のすべてのテキスト ファイルを取得するだけです。見つかったサブディレクトリごとに、テキスト ファイルとそれより深いサブディレクトリも検索します。問題は、これらのより深いサブディレクトリにさらに深いサブディレクトリがある場合、すべてのテキスト ファイルが見つからないことです。これはどこまで深くなるかわからないので、再帰が必要な問題のようです。

これまでの私のコードは次のとおりです。

File rootDirectory = new File(rootDir);
if (rootDirectory.isDirectory()) {
    System.out.println("Valid directory");

    File[] listOfFiles = rootDirectory.listFiles(); 
    for (int i = 0; i < listOfFiles.length; i++) {
        String iName = listOfFiles[i].getName();
        if (listOfFiles[i].isFile()) {
            if (iName.endsWith(".txt") || iName.endsWith(".TXT")) {
                System.out.println("File: "+iName);
            }
        }
        if (listOfFiles[i].isDirectory()) {
            System.out.println("Directory: "+iName);

            File[] subList = listOfFiles[i].listFiles();
            for (int j = 0; j < subList.length; j++) {
                String jName = subList[j].getName();
                if (subList[j].isFile()) {
                    if (jName.endsWith(".txt") || jName.endsWith(".TXT")) {
                        System.out.println("\tFile: "+jName);
                    }
                }
                if (subList[j].isDirectory()) {
                    System.out.println("\tDirectory: "+jName);
                }
            }
        }
    }
}
else System.out.println("Invalid directory");

編集:うまくいきました、Olaf Dietscheに感謝します:

public void findFiles(File root, int depth) {
    File[] listOfFiles = root.listFiles();
    for (int i = 0; i < listOfFiles.length; i++) {
        String iName = listOfFiles[i].getName();
        if (listOfFiles[i].isFile()) {
            if (iName.endsWith(".txt") || iName.endsWith(".TXT")) {
                for (int j = 0; j < depth; j++) System.out.print("\t");
                System.out.println("File: "+iName);
            }
        }
        else if (listOfFiles[i].isDirectory()) {
            for (int j = 0; j < depth; j++) System.out.print("\t");
            System.out.println("Directory: "+iName);
            findFiles(listOfFiles[i], depth+1);
        }
    }
}
4

3 に答える 3

9

これは再帰的な問題です

public void find_files(File root)
{
    File[] files = root.listFiles(); 
    for (File file : files) {
        if (file.isFile()) {
            ...
        } else if (file.isDirectory()) {
            find_files(file);
        }
    }
}
于 2012-11-18T21:24:22.680 に答える
2

Java 7 の java.nio.file 機能を使用します。同様の関数を実装しました。いくつかのテストを追加しました。

PC で .txt を検索するときのベンチマーク

            "c:/"  "c:/windows"
file.io   36272ms       14082ms
file.nio   7167ms        2987ms  

詳細は javadoc を参照してください。これは非常に強力な API です。

java.nio.file.filevisitor javadoc

public static void main(String[] args) {
    long starttime = System.currentTimeMillis();
    try {
        Path startPath = Paths.get("c:/");
        Files.walkFileTree(startPath, new SimpleFileVisitor<Path>() {
            @Override
            public FileVisitResult preVisitDirectory(Path dir,
                    BasicFileAttributes attrs) {
                System.out.println("Dir: " + dir.toString());
                return FileVisitResult.CONTINUE;
            }

            @Override
            public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) {
                if (file.toString().endsWith(".txt")){
                    System.out.println(file.toString());    
                }
                return FileVisitResult.CONTINUE;
            }

            @Override
            public FileVisitResult visitFileFailed(Path file, IOException e) {
                return FileVisitResult.CONTINUE;
            }
        });
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    long completetime = System.currentTimeMillis() - starttime;
    System.out.println("totaltime=" + completetime);

}
于 2012-11-24T18:27:00.380 に答える
1

答えは質問のタグにあります。再帰を使用します。再帰は、メソッド呼び出し自体を持つことにあります。

この場合、メソッドは、指定されたディレクトリの直下にあるすべてのテキスト ファイルを出力し、ディレクトリのすべてのサブディレクトリに対してそれ自体を呼び出す必要があります。

于 2012-11-18T21:22:58.247 に答える