Автор оригинала: Eugen Paraschiv.
1. Обзор
В этом учебнике – мы узнаем, как получить размер папки в Java – с использованием Java 6, 7 и новой Java 8, а также Guava и Apache Common IO.
Наконец – мы также получим читаемое человеком представление размера каталога.
2. С Java
Начнем с простого примера расчета размера папки – используя сумму его содержания :
private long getFolderSize(File folder) { long length = 0; File[] files = folder.listFiles(); int count = files.length; for (int i = 0; i < count; i++) { if (files[i].isFile()) { length += files[i].length(); } else { length += getFolderSize(files[i]); } } return length; }
Мы можем протестировать наш метод getFolderSize () как в следующем примере:
@Test public void whenGetFolderSizeRecursive_thenCorrect() { long expectedSize = 12607; File folder = new File("src/test/resources"); long size = getFolderSize(folder); assertEquals(expectedSize, size); }
Примечание: listFiles () используется для перечисления содержимого данной папки.
3. С Java 7
Далее – давайте посмотрим, как использовать Java 7, чтобы получить размер папки . В следующем примере мы используем Files.walkFileTree () для обхода всех файлов в папке, чтобы суммировать их размеры:
@Test public void whenGetFolderSizeUsingJava7_thenCorrect() throws IOException { long expectedSize = 12607; AtomicLong size = new AtomicLong(0); Path folder = Paths.get("src/test/resources"); Files.walkFileTree(folder, new SimpleFileVisitor() { @Override public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException { size.addAndGet(attrs.size()); return FileVisitResult.CONTINUE; } }); assertEquals(expectedSize, size.longValue()); }
Обратите внимание, как мы используем возможности обхода дерева файловой системы здесь и используем шаблон посетителя, чтобы помочь нам посетить и рассчитать размеры каждого файла и субфолдер.
4. С Java 8
Теперь – давайте посмотрим, как получить размер папки с помощью Java 8, поток операций и lambdas . В следующем примере мы используем Файлы.прогулка () для обхода всех файлов в папке, чтобы суммировать их размер:
@Test public void whenGetFolderSizeUsingJava8_thenCorrect() throws IOException { long expectedSize = 12607; Path folder = Paths.get("src/test/resources"); long size = Files.walk(folder) .filter(p -> p.toFile().isFile()) .mapToLong(p -> p.toFile().length()) .sum(); assertEquals(expectedSize, size); }
Примечание: картаToLong () используется для создания Лонгстрим применяя длина функции в каждом элементе , после чего мы можем сумма и получить конечный результат.
5. С Apache Commons IO
Далее – давайте посмотрим, как получить размер папки с помощью ИО- Apache Commons . В следующем примере – мы просто используем FileUtils.sizeOfDirectory () чтобы получить размер папки:
@Test public void whenGetFolderSizeUsingApacheCommonsIO_thenCorrect() { long expectedSize = 12607; File folder = new File("src/test/resources"); long size = FileUtils.sizeOfDirectory(folder); assertEquals(expectedSize, size); }
Обратите внимание, что этот метод утилиты в точке реализует простое решение Java 6 под капотом.
Кроме того, обратите внимание, что библиотека также предоставляет FileUtils.sizeOfDirectoryAsBigInteger() метод, который имеет дело с безопасностью ограниченных каталогов лучше.
6. С Гуавой
Теперь — давайте посмотрим, как рассчитать размер папки с помощью Гуава . В следующем примере мы используем Файлы.файлТриТраверсер () для обхода всех файлов в папке, чтобы суммировать их размер:
@Test public void whenGetFolderSizeUsingGuava_thenCorrect() { long expectedSize = 12607; File folder = new File("src/test/resources"); Iterablefiles = Files.fileTraverser().breadthFirst(folder); long size = StreamSupport.stream(files.spliterator(), false) .filter(f -> f.isFile()) .mapToLong(File::length).sum(); assertEquals(expectedSize, size); }
7. Человеческий читаемый размер
Наконец – давайте посмотрим, как получить более читаемое представление пользователя о размере папки – а не только размер байтов:
@Test public void whenGetReadableSize_thenCorrect() { File folder = new File("src/test/resources"); long size = getFolderSize(folder); String[] units = new String[] { "B", "KB", "MB", "GB", "TB" }; int unitIndex = (int) (Math.log10(size) / 3); double unitValue = 1 << (unitIndex * 10); String readableSize = new DecimalFormat("#,##0.#") .format(size / unitValue) + " " + units[unitIndex]; assertEquals("12.3 KB", readableSize); }
Примечание: Мы использовали Десятичнаяформа (“К”, #0, “) округлять результат в одно десятичное место.
8. Заметки
Вот несколько заметок о расчете размера папки:
- Оба Файлы.прогулка () и Files.walkFileTree () бросит SecurityException, если менеджер безопасности отказано в доступе к исходному файлу.
- Бесконечный цикл может произойти, если папка содержит символические ссылки.
9. Заключение
В этом быстром учебнике мы проиллюстрировали примеры использования различных Java версии, ИО- Apache Commons и Гуава для расчета размера каталога в файловой системе.
Осуществление этих примеров можно найти в проект GitHub – это Maven основе проекта, поэтому она должна быть легко импортировать и работать, как она есть.