簡體   English   中英

列出文件夾內容,包括所有子目錄和文件

[英]List Folder contents including all sub directories and files

給定文件夾結構:

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

我正在嘗試編寫一個打印出所有文件夾名稱,然后是所有文件名的小應用程序。 output 應如下所示:

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 中有現成的 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(..)返回目錄內容的 stream。 使用 stream 上的聚合操作,您可以過濾內容。

還有一種 遍歷文件樹的老方法

您已經看到了一些關於如何使用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>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM