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

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

Ответы [ 3 ]

54 голосов
/ 31 августа 2011

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

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

6 голосов
/ 09 ноября 2013

Вот готовый пример, который также пропускает и регистрирует каталоги, в которые он не может войти. Для накопления состояния используется 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();
}
5 голосов
/ 12 декабря 2011
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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...