【发布时间】:2021-10-04 18:46:00
【问题描述】:
我有一个这样的文件夹结构:
/home/user/root/
dir1/
subDir1/
pdf1.pdf
log1.log
subDir2/
somefile.txt
subDir3
dir2/
subDir1
subDir4
subDir5
abc.txt
def.pdf
xyz.log
等等
我的要求是给定输入路径“/home/user/root/”,得到一个Map<String, List<String>>,如下:
key: dir1, value: [subDir1, subDir2, subDir3]
key: dir2, value: [subDir1, subDir4, subDir5]
...
...
也就是说,地图的键是给定输入下的第一级目录,然后每个键都有一个值,即第一级下的子目录列表。
我可以获得一级目录的列表:
private Set<String> listFilesUsingFileWalk(String rootDir, int depth) throws IOException {
Path path = Paths.get(rootDir);
try (Stream<Path> stream = Files.walk(path, depth)) {
return stream
.filter(file -> Files.isDirectory(file) && !file.equals(path))
.map(Path::getFileName)
//.forEach(d -> System.out.println(d.getFileName()));
.map(Path::toString)
.collect(Collectors.toSet());
}
}
但无法获得所需的输出。我认为递归可能是一种解决方案,但不能从 Java 8 流的角度考虑。
请问可以告知一下吗?
【问题讨论】:
-
深度是什么意思?在您的要求中,您仅将第一级作为键,将第二级作为值。那么,它总是那么深吗?
-
depth对于 dir1、dir2 等为 1,对于 subDir1、subDir2 等为 2(从根目录) -
子目录名不可能是父目录吗?
-
没有。根目录下的
root、parentDir和 parentDir 下的subDirs将始终具有不同的名称
标签: collections java-8 java-stream