Java - подсчитать все расширения файлов в папке, используя DirectoryStream
Я хотел бы показать все расширения файлов в определенной папке и дать общее значение для каждого расширения, используя 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 ответа
Сначала проверьте, является ли это файл, если это так, извлеките расширение имени файла. Наконец, используйте 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()));
}
Вы можете попробовать что-то вроде этого:
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();
}
Вы даже можете вернуть карту и расположить результаты так, как вы хотите.