Получить размер папки или файла
Это возвращает длину файла в байтах или 0 , если файл не существует. Нет встроенного способа получить размер папки, вам придется рекурсивно пройти по дереву каталогов (используя метод listFiles() файлового объекта, представляющего каталог) и накопить размер каталога для сами:
ВНИМАНИЕ : этот метод недостаточно надежен для промышленного использования. directory.listFiles() может вернуть null и вызвать NullPointerException . Кроме того, он не рассматривает символические ссылки и, возможно, имеет другие режимы сбоя. Используйте этот метод.
Используя java-7 nio api, вычислить размер папки можно намного быстрее.
Вот готовый к запуску пример, который надежен и не вызывает исключения. Он будет регистрировать каталоги, в которые он не может войти или имел проблемы с перемещением. Символьные ссылки игнорируются, и одновременное изменение каталога не вызовет больше проблем, чем необходимо.
Обратите внимание, что вам нужно будет вручную проверить, является ли файл каталогом, поскольку метод выдает исключение, если ему передается не каталог.
ПРЕДУПРЕЖДЕНИЕ : этот метод (по состоянию на Commons-io 2.4) содержит ошибку и может вызывать IllegalArgumentException , если каталог одновременно изменяется.
Было бы лучше использовать Files::size на шаге карты, но это вызывает проверенное исключение.
ОБНОВЛЕНИЕ:
Вы также должны знать, что это может вызвать исключение, если некоторые файлы / папки недоступны. См. Этот вопрос и другое решение с использованием Гуава.
Для Java 8 это один из правильных способов:
Важно отфильтровать все каталоги , поскольку не гарантируется, что метод length для каталогов будет равен 0.
По крайней мере, этот код предоставляет такую же информацию о размере, как и сам проводник Windows.
Вот лучший способ получить общий размер файла (работает для каталога и не в каталоге):
Изменить: обратите внимание, что это, вероятно, займет много времени. Не запускайте его в потоке пользовательского интерфейса.
Кроме того, здесь (взято из https://stackoverflow.com/a/5599842/1696171) — хороший способ получить читаемая пользователем строка из длинного возвращенного:
Обратите внимание, что это не работает для каталогов или не гарантируется.
Что вы хотите от каталога? Если это общий размер всех файлов под ним, вы можете рекурсивно пройтись с детьми, используя File.list() и File.isDirectory() , и суммировать их размеры.
У объекта File есть метод length :
Если вы хотите использовать Java 8 NIO API, следующая программа напечатает размер в байтах каталога, в котором она находится.
Метод calculateSize универсален для объектов Path , поэтому он также работает для файлов. Обратите внимание : если файл или каталог недоступны, в этом случае возвращаемый размер объекта пути будет 0 .
- Работает на Android и Java
- Работает как для папок, так и для файлов
- Проверяет наличие нулевого указателя везде, где это необходимо
- Игнорирует символическую ссылку, также известную как ярлыки.
- Производство готово!
Для окон, использующих java.io, эта рекурсивная функция полезна.
Это проверено и работает на моей стороне.
Я тестировал du -c <folderpath> и работает в 2 раза быстрее, чем nio. Файлы или рекурсия
После долгих исследований и изучения различных решений, предлагаемых здесь, в StackOverflow. Наконец я решил написать собственное решение. Моя цель — иметь механизм без выброса, потому что я не хочу сбой, если API не может получить размер папки. Этот метод не подходит для многопоточного сценария.
Прежде всего, я хочу проверить действительные каталоги при просмотре дерева файловой системы.
Во-вторых, я не хочу, чтобы мой рекурсивный вызов переходил в символические ссылки (мягкие ссылки) и включал размер в общую совокупность.
Наконец, моя реализация на основе рекурсии для получения размера указанного каталога. Обратите внимание на нулевую проверку для dir.listFiles (). Согласно javadoc, этот метод может возвращать значение null.
Немного крема на торте, API для получения размера списка файлов (может быть все файлы и папка в корневом каталоге).
В Linux, если вы хотите отсортировать каталоги, тогда du -hs * | sort -h
Вы можете использовать Apache Commons IO , чтобы легко определить размер папки.
Если вы используете maven, добавьте следующую зависимость в свой файл pom.xml .
Если вы не являетесь поклонником Maven, загрузите следующую банку и добавьте ее в путь к классам.
Как узнать размер файла в java
Класс File, определенный в пакете java.io, не работает напрямую с потоками. Его задачей является управление информацией о файлах и каталогах. Хотя на уровне операционной системы файлы и каталоги отличаются, но в Java они описываются одним классом File.
В зависимости от того, что должен представлять объект File — файл или каталог, мы можем использовать один из конструкторов для создания объекта:
Класс File имеет ряд методов, которые позволяют управлять файлами и каталогами. Рассмотрим некоторые из них:
boolean createNewFile() : создает новый файл по пути, который передан в конструктор. В случае удачного создания возвращает true, иначе false
boolean delete() : удаляет каталог или файл по пути, который передан в конструктор. При удачном удалении возвращает true.
boolean exists() : проверяет, существует ли по указанному в конструкторе пути файл или каталог. И если файл или каталог существует, то возвращает true, иначе возвращает false
String getAbsolutePath() : возвращает абсолютный путь для пути, переданного в конструктор объекта
String getName() : возвращает краткое имя файла или каталога
String getParent() : возвращает имя родительского каталога
boolean isDirectory() : возвращает значение true, если по указанному пути располагается каталог
boolean isFile() : возвращает значение true, если по указанному пути находится файл
boolean isHidden() : возвращает значение true, если каталог или файл являются скрытыми
long length() : возвращает размер файла в байтах
long lastModified() : возвращает время последнего изменения файла или каталога. Значение представляет количество миллисекунд, прошедших с начала эпохи Unix
String[] list() : возвращает массив файлов и подкаталогов, которые находятся в определенном каталоге
File[] listFiles() : возвращает массив файлов и подкаталогов, которые находятся в определенном каталоге
boolean mkdir() : создает новый каталог и при удачном создании возвращает значение true
boolean renameTo(File dest) : переименовывает файл или каталог
Работа с каталогами
Если объект File представляет каталог, то его метод isDirectory() возвращает true . И поэтому мы можем получить его содержимое — вложенные подкаталоги и файлы с помощью методов list() и listFiles() . Получим все подкаталоги и файлы в определенном каталоге:
Теперь выполним еще ряд операций с каталогами, как удаление, переименование и создание:
Работа с файлами
Работа с файлами аналогична работе с каталога. Например, получим данные по одному из файлов и создадим еще один файл:
При создании нового файла метод createNewFile() в случае неудачи выбрасывает исключение IOException , поэтому нам надо его отлавливать, например, в блоке try. catch, как делается в примере выше.
Как узнать размер файла в java
The conversion of a pathname string to or from an abstract pathname is inherently system-dependent. When an abstract pathname is converted into a pathname string, each name is separated from the next by a single copy of the default separator character. The default name-separator character is defined by the system property file.separator , and is made available in the public static fields separator and separatorChar of this class. When a pathname string is converted into an abstract pathname, the names within it may be separated by the default name-separator character or by any other name-separator character that is supported by the underlying system.
A pathname, whether abstract or in string form, may be either absolute or relative. An absolute pathname is complete in that no other information is required in order to locate the file that it denotes. A relative pathname, in contrast, must be interpreted in terms of information taken from some other pathname. By default the classes in the java.io package always resolve relative pathnames against the current user directory. This directory is named by the system property user.dir , and is typically the directory in which the Java virtual machine was invoked.
The parent of an abstract pathname may be obtained by invoking the getParent() method of this class and consists of the pathname’s prefix and each name in the pathname’s name sequence except for the last. Each directory’s absolute pathname is an ancestor of any File object with an absolute abstract pathname which begins with the directory’s absolute pathname. For example, the directory denoted by the abstract pathname "/usr" is an ancestor of the directory denoted by the pathname "/usr/local/bin".
- For UNIX platforms, the prefix of an absolute pathname is always «/» . Relative pathnames have no prefix. The abstract pathname denoting the root directory has the prefix «/» and an empty name sequence.
- For Microsoft Windows platforms, the prefix of a pathname that contains a drive specifier consists of the drive letter followed by «:» and possibly followed by «\\» if the pathname is absolute. The prefix of a UNC pathname is «\\\\» ; the hostname and the share name are the first two names in the name sequence. A relative pathname that does not specify a drive has no prefix.
Instances of this class may or may not denote an actual file-system object such as a file or a directory. If it does denote such an object then that object resides in a partition. A partition is an operating system-specific portion of storage for a file system. A single storage device (e.g. a physical disk-drive, flash memory, CD-ROM) may contain multiple partitions. The object, if any, will reside on the partition named by some ancestor of the absolute form of this pathname.
A file system may implement restrictions to certain operations on the actual file-system object, such as reading, writing, and executing. These restrictions are collectively known as access permissions. The file system may have multiple sets of access permissions on a single object. For example, one set may apply to the object’s owner, and another may apply to all other users. The access permissions on an object may cause some methods in this class to fail.
Instances of the File class are immutable; that is, once created, the abstract pathname represented by a File object will never change.