按文件大小排序文件流

时间:2018-04-08 19:50:44

标签: java file sorting java-stream

我试图在某个文件树中获取前5个最大的文件,但我很困惑如何在流中正确排序它们。问题是我不知道在哪里获取我的排序应该基于的参数。

try (Stream<Path> stream = Files.walk(Paths.get("/home/stanislav/test"))) {
    stream
        .sorted(Comparator.comparing())
        .limit(5)
        .forEach(System.out::println);
}

这是我能想到的唯一代码块。我确实理解我正在处理类型为Stream的{​​{1}}。有什么方法可以改变它并以流方式完成任务吗?如果是这样,我该如何让我的分拣线对文件大小进行操作?

3 个答案:

答案 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.walkFiles.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);
}