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

Как получить размер каталога на Java

В Java мы можем использовать NIO `FileVisitor`, чтобы получить размер каталога или папки.

В Java мы можем использовать Files.size чтобы получить размер файла; для размера каталога или папки нам нужно рекурсивно посчитать размер каталога (сумма Files.size всех файлов).

В этом примере показано несколько распространенных способов определения размера каталога или папки.

  1. Файловый посетитель (Java 7)
  2. Файлы.прогулка ( Java 8)
  3. Каталог файлов.Размер (Общий ввод-вывод Apache)
  4. Сумма файл.длина всех файлов. (Устаревший ввод-вывод)

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/”