Я пытаюсь получить топ-5 самых больших файлов в каком-то дереве файлов, и я не понимаю, как правильно их отсортировать в потоке. Дело в том, что я понятия не имею, где взять параметр, на котором должна основываться моя сортировка.
try (Stream<Path> stream = Files.walk(Paths.get("/home/stanislav/test"))) {
stream
.sorted(Comparator.comparing())
.limit(5)
.forEach(System.out::println);
}
Это единственный фрагмент кода, который я мог придумать. Я понимаю, что имею дело с Stream типа Path. Есть ли способ преобразовать это и выполнить задачу в потоковом режиме? Если да, то что мне делать, чтобы моя строка сортировки работала с размером файла?




Укажите длину файла компаратору:
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() используется для сортировки по убыванию.
Вы можете сделать что-то вроде этого:
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.
Files.size использует неблокирующий ввод-вывод.
Вы можете выполнить поставленную задачу, распаковав длину файла с помощью 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);
}
Быстро и прямо в точку! Большое тебе спасибо! Вы спасли день.