【问题标题】:List Folder contents including all sub directories and files列出文件夹内容,包括所有子目录和文件
【发布时间】:2021-03-13 16:33:25
【问题描述】:

给定文件夹结构:

FolderA
|_FolderB 
  |_FolderC
    |_File5
  |_FolderD
    |_File3
    |_File4
  |_File1 
  |_File2

我正在尝试编写一个小应用程序来打印所有文件夹名,然后是所有文件名。输出应如下所示:

FolderA
FolderB
FolderC
FolderD
File1
File2
File3
File4
File5

到目前为止,我的尝试如下所示:

public class FileList {

    public static void main(String[] args) {

        File rootFile = new File("FolderA");
        File[] files = rootFile.listFiles();
        
        System.out.println("Root file path: " + rootFile.getAbsolutePath() + "\n");
        
        List<File> folderList = new LinkedList<File>();
        List<File> fileList = new LinkedList<File>();
        listFilesAndFolders(files, rootFile, folderList, fileList);
        
        extractFromList(folderList);
        extractFromList(fileList);
        
    }
    
    private static void listFilesAndFolders(File[] fList, File directoryName, List<File> folderList, List<File> fileList) {
        
        // Get all files from a directory.
        if(fList != null) {
            for (File file : fList) {      
                if (file.isFile()) {
                    fileList.add(file);
                } else if (file.isDirectory()) {
                    folderList.add(file);
                }
            }
        }
    }
    
    private static void extractFromList(List<File> list) {
        for (File item : list) {
            System.out.println(item.getName());
        }
    }
}

不幸的是,它只打印出 FolderA 的直接内容,而不是 anf 子文件或目录,所以我只得到:

FolderB
FolderC
file2
file1

如何更改此设置以获取所有子文件和文件夹?

【问题讨论】:

    标签: java list file


    【解决方案1】:

    这称为遍历目录。 Java 中有现成的 API。使用 NIO apis 实现如下:

    Files.walk(Paths.get("E:\\temp")) 
                .filter(p -> Files.isDirectory(p)) 
                .forEach(System.out::println);
    
    Files.walk(Paths.get("E:\\temp")) 
            .filter(p -> Files.isRegularFile(p)) 
            .forEach(System.out::println);
    

    Files.walk(..) 返回目录的内容流。在流上使用aggregate operations 可以过滤内容。

    还有一个old way of walking the file tree

    【讨论】:

      【解决方案2】:

      您已经看到了如何使用Files.walk 的一些很好的示例。

      也可以考虑的另一种选择是 Apache 臭名昭著的commons-io。根据我的观察,它速度更快,甚至更可定制。

      递归地列出文件:

      FileUtils.listFiles(new File("\\path"), null, true)
              .forEach(System.out::println);
      
      /*
        1. "null" can be changed with extensions array, like String[]{"jar", "txt"}, in order to filter file types that you want to list;
        2. "true" specifies, that you want a recursive search. "false" can also be used.
      */
      

      递归地列出目录:

      FileUtils.listFilesAndDirs(new File("\\path"),
              new NotFileFilter(TrueFileFilter.TRUE),
              DirectoryFileFilter.DIRECTORY)
              .forEach(System.out::println);
      

      你需要:

      <dependency>
          <groupId>commons-io</groupId>
          <artifactId>commons-io</artifactId>
      </dependency>
      

      【讨论】:

        猜你喜欢
        • 2012-07-08
        • 1970-01-01
        • 2016-11-16
        • 2011-10-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多