Java - подсчитать все расширения файлов в папке, используя DirectoryStream - PullRequest
1 голос
/ 30 марта 2019

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

Теперь я только показываю все файлы в этой папке, но как вместо этого получить только их расширения? Я также должен получить расширения этих файлов и подсчитать сумму для каждого расширения в этой папке (см. Вывод ниже).

public static void main (String [] args) throws IOException {

    Path path = Paths.get(System.getProperty("user.dir"));

    if (Files.isDirectory(path)){
        DirectoryStream<Path> directoryStream = Files.newDirectoryStream(path);

        for (Path p: directoryStream){
            System.out.println(p.getFileName());
        }
    } else {
        System.out.printf("Path was not found.");
    }
}

Вывод должен выглядеть следующим образом. Я полагаю, лучший способ получить этот вывод - использовать лямбды?

FILETYPE    TOTAL
------------------
CLASS    |  5
TXT      |  10
JAVA     |  30
EXE      |  27

Ответы [ 2 ]

4 голосов
/ 30 марта 2019

Сначала проверьте, является ли это файл, если это так, извлеките расширение имени файла.Наконец, используйте сборщик groupingBy, чтобы получить желаемую структуру словаря.Вот как это выглядит.

try (Stream<Path> stream = Files.list(Paths.get("path/to/your/file"))) {
    Map<String, Long> fileExtCountMap = stream.filter(Files::isRegularFile)
        .map(f -> f.getFileName().toString().toUpperCase())
        .map(n -> n.substring(n.lastIndexOf(".") + 1))
        .collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));
}
0 голосов
/ 30 марта 2019

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

public class FileCount {
    public static void main(String[] args) throws IOException {
        Path path = Paths.get(System.getProperty("user.dir"));

        if (Files.isDirectory(path)) {

            Map<String, Long> result = Files.list(path).filter(f -> f.toFile().isFile()).map(FileCount::getExtension)
                    .collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));

            System.out.println(result);
        } else {
            System.out.printf("Path was not found.");
        }

    }

    public static String getExtension(Path path) {
        String parts[] = path.toString().split("\\.");
        if (1 < parts.length) {
            return parts[parts.length - 1];
        }

        return path.toString();
    }

Вы даже можете вернуть Карту и расположить результаты так, как вы хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...