В Java мы можем использовать Files.size чтобы получить размер файла; для размера каталога или папки нам нужно рекурсивно посчитать размер каталога (сумма Files.size всех файлов).
В этом примере показано несколько распространенных способов определения размера каталога или папки.
Файловый посетитель(Java 7)Файлы.прогулка( Java 8)Каталог файлов.Размер(Общий ввод-вывод Apache)- Сумма
файл.длинавсех файлов. (Устаревший ввод-вывод)
1. Размер каталога – Файловый редактор (Java 7)
В этом примере используется FileVisitor для просмотра всех файлов по указанному пути и суммирования размера всех файлов.
// size of directory in bytes
public static long getDirectorySizeJava7(Path path) {
AtomicLong size = new AtomicLong(0);
try {
Files.walkFileTree(path, new SimpleFileVisitor<>() {
@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) {
// sum size of all visit file
size.addAndGet(attrs.size());
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult visitFileFailed(Path file, IOException e) {
System.out.printf("Failed to get size of %s%n%s", file, e);
return FileVisitResult.CONTINUE;
}
});
} catch (IOException e) {
System.out.printf("%s", e);
}
return size.get();
}
2. Размер каталога – Файлы.прогулка (Java 8)
В этом примере используются файлы Java 8 .прогулка и Поток для рекурсивного обхода каталога и суммирования размера всех файлов.
// size of directory in bytes
public static long getDirectorySizeJava8(Path path) {
long size = 0;
// need close Files.walk
try (Stream walk = Files.walk(path)) {
size = walk
//.peek(System.out::println) // debug
.filter(Files::isRegularFile)
.mapToLong(p -> {
// ugly, can pretty it with an extract method
try {
return Files.size(p);
} catch (IOException e) {
System.out.printf("Failed to get size of %s%n%s", p, e);
return 0L;
}
})
.sum();
} catch (IOException e) {
System.out.printf("IO errors %s", e);
}
return size;
}
3. Размер каталога – Имена файлов (общий ввод-вывод Apache)
В этом примере используется общий ввод-вывод Apache FileUtils.sizeofdirectory для получения размера каталога.
commons-io commons-io 2.7
public static long getDirectorySizeCommonIO(File dir) {
return FileUtils.sizeOfDirectory(dir);
}
4. Унаследованный IO
В устаревшем IO мы можем использовать file.listFiles() для рекурсивного обхода каталога и file.длина() для суммирования размера всех файлов.
public static long getDirectorySizeLegacy(File dir) {
long length = 0;
File[] files = dir.listFiles();
if (files != null) {
for (File file : files) {
if (file.isFile())
length += file.length();
else
length += getDirectorySizeLegacy(file);
}
}
return length;
}
Скачать Исходный Код
$клон git $клон git
$cd java-ввод-вывод
Рекомендации
Оригинал: “https://mkyong.com/java/how-to-get-size-of-a-directory-in-java/”