我试图在某个文件树中获取前5个最大的文件,但我很困惑如何在流中正确排序它们。问题是我不知道在哪里获取我的排序应该基于的参数。
try (Stream<Path> stream = Files.walk(Paths.get("/home/stanislav/test"))) {
stream
.sorted(Comparator.comparing())
.limit(5)
.forEach(System.out::println);
}
这是我能想到的唯一代码块。我确实理解我正在处理类型为Stream
的{{1}}。有什么方法可以改变它并以流方式完成任务吗?如果是这样,我该如何让我的分拣线对文件大小进行操作?
答案 0 :(得分:2)
给比较器提供文件长度:
try (Stream<Path> stream = Files.walk(Paths.get("/home/stanislav/test"))) {
stream
.sorted(Comparator.comparing(p -> p.toFile().length(), Comparator.reverseOrder()))
.limit(5)
.forEach(System.out::println);
}
Comparator.reverseOrder()
用于按降序排序。
答案 1 :(得分:2)
您可以这样做:
Files.walk(Paths.get("/home/stanislav/test"))
.sorted((o1, o2) -> Long.signum(Files.size(o1) - Files.size(o2)))
.limit(5)
.forEach(System.out::println);
对Files.walk
和Files.size
进行IO异常处理。
Files.size
使用非阻塞I / O.
答案 2 :(得分:1)
您可以通过toFile().length()
提取文件的长度来完成手头的任务。
try (Stream<Path> stream = Files.walk(Paths.get("/home/stanislav/test"))) {
stream.sorted(Comparator.comparingLong((Path path) -> path.toFile().length())
.reversed())
.limit(5)
.forEach(System.out::println);
}