Получить размер файла/каталога с помощью Java 7 new IO

Как я могу получить размер файла или каталога с помощью нового NIO в java 7?

Ответ 1

Используйте Files.size(Path), чтобы получить размер файла.

Для размера каталога (что означает размер всех файлов, содержащихся в нем), по-прежнему вам необходимо перезаписать вручную, насколько мне известно.

Ответ 2

MutableLong size = new MutableLong();
Files.walkFileTree(directoryPath, new SimpleFileVisitor<Path>() {
            @Override
            public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
                size.add(attrs.size());
            }
}

Это вычислит размер всех файлов в каталоге. Однако обратите внимание, что все файлы в каталоге должны быть обычными файлами, так как API задает метод размера BasicFileAttributes:

"Размер файлов, которые не являются обычными файлами, специфичен для реализации и поэтому не указан".

Если вы спотыкаетесь на нерегулируемый файл, вам придется либо не включать его, либо возвращать неизвестный размер. Вы можете проверить правильность файла с помощью

BasicFileAttributes.isRegularFile()

Ответ 3

Вот пример, готовый к запуску, который также будет содержать каталоги пропусков и журналов, которые он не может ввести. Он использует java.util.concurrent.atomic.AtomicLong для накопления состояния.

public static void main(String[] args) throws IOException {
    Path path = Paths.get("c:/");
    long size = getSize(path);
    System.out.println("size=" + size);
}

static long getSize(Path startPath) throws IOException {
    final AtomicLong size = new AtomicLong(0);

    Files.walkFileTree(startPath, new SimpleFileVisitor<Path>() {
        @Override
        public FileVisitResult visitFile(Path file,
                BasicFileAttributes attrs) throws IOException {
            size.addAndGet(attrs.size());
            return FileVisitResult.CONTINUE;
        }

        @Override
        public FileVisitResult visitFileFailed(Path file, IOException exc)
                throws IOException {
            // Skip folders that can't be traversed
            System.out.println("skipped: " + file + "e=" + exc);
            return FileVisitResult.CONTINUE;
        }
    });

    return size.get();
}