迭代Java中的所有文件

时间:2012-05-21 19:13:49

标签: java file path iterator directory

我想让我的程序打印出我计算机上所有文件的大量列表。我的问题是它只打印第一个硬盘驱动器的第一个文件夹中的文件,当我想要它打印我的计算机上的所有文件。我有什么想法在这里做错了吗?感谢。

以下是我使用的代码:

主:

import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;

public class Main {

    public static void main(String[] args) {
        ArrayList<File> roots = new ArrayList();
        roots.addAll(Arrays.asList(File.listRoots()));


        for (File file : roots) {
            new Searcher(file.toString().replace('\\', '/')).search();
        }
    }
}

和Searcher课程:

import java.io.File;

public class Searcher {

    private String root;

    public Searcher(String root) {
        this.root = root;
    }

    public void search() {
        System.out.println(root);
        File folder = new File(root);
        File[] listOfFiles = folder.listFiles();
        for (File file : listOfFiles) {
            String path = file.getPath().replace('\\', '/');
            System.out.println(path);
            if (!path.contains(".")) {
                new Searcher(path + "/").search();
            }
        }
    }
}

5 个答案:

答案 0 :(得分:6)

我刚试过这个,它对我有用。我确实必须添加一个null检查并更改了目录评估方法:

package test;

import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;

public class Searcher {
    public static void main(String[] args) {
        ArrayList<File> roots = new ArrayList<File>();
        roots.addAll(Arrays.asList(File.listRoots()));


        for (File file : roots) {
            new Searcher(file.toString().replace('\\', '/')).search();
        }
    }

    private String root;

    public Searcher(String root) {
        this.root = root;
    }

    public void search() {
        System.out.println(root);
        File folder = new File(root);
        File[] listOfFiles = folder.listFiles();
        if(listOfFiles == null) return;  // Added condition check
        for (File file : listOfFiles) {
            String path = file.getPath().replace('\\', '/');
            System.out.println(path);
            if (file.isDirectory()) {
                new Searcher(path + "/").search();
            }
        }
    }
}

答案 1 :(得分:2)

您应该像这样更新搜索方法:

public void search() {
        System.out.println(root);
        File folder = new File(root);
        File[] listOfFiles = folder.listFiles();
        for (File file : listOfFiles) {
            String path = file.getPath().replace('\\', '/');
            System.out.println(path);
            if (file.isDirectory()) {
                new Searcher(path + "/").search();
            }
        }
    }

答案 2 :(得分:1)

如果选择Java 7,请查看walkFileTree() method。它允许您访问树中的所有文件和目录,您可以从驱动器的根目录开始。只需实施基本FileVisitor即可处理每个Path的文件属性。您可以开始使用here

答案 3 :(得分:1)

答案 4 :(得分:0)

我不知道你得到了什么错误,但我得到了一个N​​PE,因为你没有在下一行之后检查null。

File[] listOfFiles = folder.listFiles();

更改代码后,它似乎运行良好,我停止它,因为我有很多文件。我假设它将继续在第一个根之后的下一个根(c:/在我的情况下)

import java.io.File;

import java.util.ArrayList; import java.util.Arrays;

公共类搜索{

    public static void main(String[] args) {
        ArrayList<File> roots = new ArrayList();
        roots.addAll(Arrays.asList(File.listRoots()));


        for (File file : roots) {
            System.out.println(file.toString());
            new Searcher(file.toString().replace('\\', '/')).search();
        }
    }
}

班级搜寻者{

private String root;

public Searcher(String root) {
    this.root = root;
}

public void search() {
    System.out.println(root);
    File folder = new File(root);
    File[] listOfFiles = folder.listFiles();
    if(listOfFiles!=null)
    {
    for (File file : listOfFiles) {
        String path = file.getPath().replace('\\', '/');
        System.out.println(path);
        if (!path.contains(".")) {
            new Searcher(path + "/").search();
        }
    }
    }
}

}