列出文件夹内容,包括所有子目录和文件



给定的文件夹结构:

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中有现成的API。使用NIO api实现如下所示:

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(..)返回目录的内容流。使用流上的聚合操作,可以过滤内容。

还有一种走档案树的老方法。

您已经看到了一些关于如何使用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>

最新更新