【问题标题】:get file names by directory and sub directory按目录和子目录获取文件名
【发布时间】:2014-10-04 01:58:28
【问题描述】:

我需要通过提供目录和子目录来获取所有文件名 由于某种原因它不起作用,我不知道是什么问题

这就是我所做的:

  import java.io.File;

public class Main
{

    public static void main(String[] args) {
        String root = "C:\\eclipse";// root directory
        String[] filename = null;

        filename = getFfileNamesAndInsertToArray(root, filename);
        printFileNames(filename);
    }

    public static void printFileNames(String[] filenames) {

        for (int i = 0; i < filenames.length; i++) {
            System.out.println(filenames[i]);
        }
    }

    public static String[] getFfileNamesAndInsertToArray(String root, String[] filenames) {

        String[] files = filenames;
        java.io.File dir = new java.io.File(root);
        for (java.io.File file : dir.listFiles()) {
            // String path = file.getAbsolutePath(); // get path of file
            if (file.isDirectory() == false) {
                files[files.length + 1] = file.getName();
            }

            else {
                root = file.getAbsolutePath();
                getFfileNamesAndInsertToArray(root, files);
            }

        }
        return files;
    }

}

【问题讨论】:

  • filesnull。此外,当发布类似堆栈跟踪的问题时很有用。

标签: java file path directory


【解决方案1】:

您不必手动执行此操作。您可以为此使用Files.walkFileTree

Path path = Paths.get("your/directory/path");
Files.walkFileTree(path, new SimpleFileVisitor<Path>() {
     @Override
     public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
       // this is called for each file
     }
 });

【讨论】:

  • 但是你知道我的解决方案吗?
【解决方案2】:

您必须初始化任何具有特定大小的数组,例如:

String[] files = new String[20];

因此,如果您不知道具体的大小(如您的情况),您可以使用 ArrayList。 如果你没有初始化你的字符串数组并且想在位置长度+1保存一个字符串,你的程序将会失败,因为你的数组在那个点没有长度。而且它不会动态分配新内存,因此它不能增长和变大。 如果您使用 String 类型的 ArrayList,则无法调用 arraylist.add-method 来添加新元素,并且列表每次都会被追加,因此您不必担心它的大小。

【讨论】:

    【解决方案3】:

    可以这样做:

    public static List<String> getListOfFiles(String root) throws IOException {
        final List<String> fileNames = new ArrayList<>();
        Files.walkFileTree(Paths.get(root), new SimpleFileVisitor<Path>() {
            @Override
            public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
                if (attrs.isRegularFile()) {
                    fileNames.add(file.getFileName().toString());
                }
                return super.visitFile(file, attrs);
            }
        });
        return fileNames;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-07-23
      • 2021-12-04
      • 2020-08-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-11
      • 1970-01-01
      相关资源
      最近更新 更多