java - 列出文件夹内容,包括所有子目录和文件
问题描述
给定文件夹结构:
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 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(..)
返回目录的内容流。使用流上的聚合操作,您可以过滤内容。
还有一种遍历文件树的老方法。
推荐阅读
- python - 突然无法在 Ubuntu Digital Ocean 上运行:仅针对 Google 请求错误
- css - 如何理解垂直对齐:-0.125em 和垂直对齐:中间的区别?
- python - 在类实例中创建新变量是什么意思?
- ruby-on-rails - Rails 5.2.3 - 验证错误显示在控制台中,但未传递到视图
- uwp - 如何隐藏 MediaPlayerElement 的 ProgressBar?
- c# - 在 C# 中,有没有办法使 2 元素浮点数组等于 Unity Vector2 变量
- java - Java 文件复制 - 如何将输入文件备份/复制到其他目标位置?
- bixby - 实例化结构枚举
- php - 有没有办法更改我的主机名来修复“php_network_getaddresses:getaddrinfo failed: No such host is known.”?
- c# - UWP 从模板化 TabViewItem 获取子级