Как я могу получить размер папки или файла в Java?
java
filesystems
один
источник
источник
StatFs
. Он использует статистику файловой системы и почти в 1000 раз быстрее, чем рекурсивные методы, которые мы не могли использовать. Нашу реализацию можно найти здесь: stackoverflow.com/a/58418639/293280Ответы:
Это возвращает длину файла в байтах или,
0
если файл не существует. Нет встроенного способа получить размер папки, вам придется рекурсивно пройти по дереву каталогов (используяlistFiles()
метод файлового объекта, представляющего каталог) и накапливать размер каталога для себя:ВНИМАНИЕ : этот метод недостаточно надежен для промышленного использования.
directory.listFiles()
может вернутьсяnull
и вызватьNullPointerException
. Кроме того, он не учитывает символические ссылки и, возможно, имеет другие режимы сбоя. Воспользуйтесь этим методом .источник
NullPointerException
если каталог одновременно изменен.Используя java-7 nio api, вычислить размер папки можно намного быстрее.
Вот готовый к запуску пример, который надежен и не вызывает исключения. Он будет регистрировать каталоги, в которые он не может войти или имел проблемы с перемещением. Символьные ссылки игнорируются, и одновременное изменение каталога не вызовет больше проблем, чем необходимо.
источник
AtomicLong
вместо простоlong
?Files
он не поддерживает его напрямую!Вам нужно
FileUtils#sizeOfDirectory(File)
от commons-io .Обратите внимание, что вам нужно будет вручную проверить, является ли файл каталогом, поскольку метод выдает исключение, если ему передается не каталог.
ПРЕДУПРЕЖДЕНИЕ : этот метод (по состоянию на commons-io 2.4) содержит ошибку и может вызывать ошибку,
IllegalArgumentException
если каталог одновременно изменяется.источник
checkDirectory(directory);
проверки. Просто убедитесь, что уFile.listFiles
него есть дети. Ссылки : FileUtils.sizeOfDirectory () , File.listFiles ()IllegalArgumentException
если каталог изменен во время итерации.В Java 8:
Было бы лучше использовать
Files::size
на этапе карты, но он выдает проверенное исключение.ОБНОВЛЕНИЕ:
вы также должны знать, что это может вызвать исключение, если некоторые файлы / папки недоступны. См. Этот вопрос и другое решение с использованием Guava .
источник
источник
size += getFolderSize(file);
Для Java 8 это один из правильных способов:
Важно отфильтровать все каталоги , поскольку не гарантируется, что метод length для каталогов будет равен 0.
По крайней мере, этот код предоставляет такую же информацию о размере, как и сам проводник Windows.
источник
Вот лучший способ получить общий размер файла (работает для каталога и не каталога):
Изменить: обратите внимание, что это, вероятно, займет много времени. Не запускайте его в потоке пользовательского интерфейса.
Кроме того, здесь (взято из https://stackoverflow.com/a/5599842/1696171 ) - хороший способ получить читаемую пользователем строку из возвращенного long:
источник
Если вы хотите использовать Java 8 NIO API, следующая программа напечатает размер в байтах каталога, в котором он находится.
calculateSize
Метод является универсальным дляPath
объектов, поэтому он также работает для файлов. Обратите внимание : если файл или каталог недоступны, в этом случае возвращаемый размер объекта пути будет0
.источник
File.length()
( Javadoc ).Обратите внимание, что это не работает для каталогов или не гарантируется.
Что вы хотите от каталога? Если это общий размер всех файлов под ним, вы можете рекурсивно пройтись с детьми, используя
File.list()
и,File.isDirectory()
и суммировать их размеры.источник
У
File
объекта естьlength
метод:источник
Исходный код:
источник
для окон, использующих java.io, эта рекурсивная функция полезна.
Это проверено и работает на моей стороне.
источник
Я тестировал
du -c <folderpath>
и работает в 2 раза быстрее, чем nio. Файлы или рекурсияисточник
источник
После долгих исследований и изучения различных решений, предлагаемых здесь, в StackOverflow. В конце концов я решил написать собственное решение. Моя цель - иметь механизм без выброса, потому что я не хочу сбой, если API не может получить размер папки.Этот метод не подходит для многопоточного сценария.
Прежде всего, я хочу проверить правильность каталогов при просмотре дерева файловой системы.
Во-вторых, я не хочу, чтобы мой рекурсивный вызов переходил в символические ссылки (softlinks) и включал размер в общую совокупность.
Наконец, моя реализация на основе рекурсии для получения размера указанного каталога. Обратите внимание на нулевую проверку для dir.listFiles (). Согласно javadoc, этот метод может возвращать значение null.
Немного крема на торте, API для получения размера списка файлов (могут быть все файлы и папка в корневом каталоге).
источник
в linux, если вы хотите отсортировать каталоги, тогда du -hs * | sort -h
источник
Вы можете использовать,
Apache Commons IO
чтобы легко найти размер папки.Если вы используете maven, добавьте в свой
pom.xml
файл следующую зависимость .Если вы не являетесь поклонником Maven, загрузите следующую банку и добавьте ее в путь к классам.
https://repo1.maven.org/maven2/commons-io/commons-io/2.6/commons-io-2.6.jar
Чтобы получить размер файла через Commons IO,
Это также возможно через
Google Guava
Для Maven добавьте следующее:
Если не используете Maven, добавьте следующее в путь к классу
https://repo1.maven.org/maven2/com/google/guava/guava/28.1-jre/guava-28.1-jre.jar
Чтобы получить размер файла,
источник
источник