Рубрики
Без рубрики

Java – Размер каталога

Рассчитайте размер каталога с Java 6, 7 и 8, а также Apache Commons IO и Guava.

Автор оригинала: 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"); 
   
    Iterable files = 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 основе проекта, поэтому она должна быть легко импортировать и работать, как она есть.