Сортировка потока файлов по размеру

Я пытаюсь получить топ-5 самых больших файлов в каком-то дереве файлов, и я не понимаю, как правильно их отсортировать в потоке. Дело в том, что я понятия не имею, где взять параметр, на котором должна основываться моя сортировка.

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

Это единственный фрагмент кода, который я мог придумать. Я понимаю, что имею дело с Stream типа Path. Есть ли способ преобразовать это и выполнить задачу в потоковом режиме? Если да, то что мне делать, чтобы моя строка сортировки работала с размером файла?

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
4
0
1 196
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Укажите длину файла компаратору:

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() используется для сортировки по убыванию.

Быстро и прямо в точку! Большое тебе спасибо! Вы спасли день.

Stanislav Codes 08.04.2018 22:06

Вы можете сделать что-то вроде этого:

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);
}

Другие вопросы по теме