Я знаю, что этот вопрос широко обсуждался в различных постах:
Моя проблема в том, что мне нужно получить размеры большого количества файлов (обычные файлы, существующие на жестком диске), и для этого мне нужно решение, обеспечивающее наилучшую производительность.Моя интуиция заключается в том, что это должно быть сделано с помощью метода, который непосредственно читает таблицу файловой системы, не получая размер файла, читая все содержимое файла .Трудно понять, какой конкретный метод используется, читая документацию.
Как указано в этой странице :
Файлы имеют метод size () дляопределить размер файла.Это самый последний API, и он рекомендуется для новых приложений Java.
Но это, видимо, не лучший совет с точки зрения производительности.Я сделал разные измерения разными методами:
file.length();
Files.size(path);
BasicFileAttributes attr = Files.readAttributes(path, BasicFileAttributes.class); attr.size();
И мое удивление в том, что file.length();
- самый быстрый способ создания объекта File
вместо использования более нового Path
.Я не сейчас, если это также читает файловую систему или содержимое.Поэтому мой вопрос:
Какой самый быстрый и рекомендуемый способ получения размеров файлов в последних версиях Java (9/10/11)?
РЕДАКТИРОВАТЬ
Я не думаю, что эти детали добавить что-либо к вопросу.В основном тест выглядит следующим образом:
Length: 49852 with previous instanciation: 84676
Files: 3451537 with previous instanciation: 5722015
Length: 48019 with previous instanciation:: 79910
Length: 47653 with previous instanciation:: 86875
Files: 83576 with previous instanciation: 125730
BasicFileAttr: 333571 with previous instanciation:: 366928
.....
Lenght
вполне соответствует.Files
заметно медленный при первом вызове, но он должен что-то кэшировать, поскольку последующие вызовы быстрее (все же медленнее, чем Lenght
).Это то, что другие люди наблюдали в некоторых ссылках, на которые я ссылаюсь выше.BasicFileAttr
была моей надеждой, но все еще медленная.
Я задаюсь вопросом, что рекомендуется в современных версиях Java, и я считал 9/10/11 "современным".Это не зависимость и не ограничение, но я предполагаю, что Java 11 должна обеспечивать лучшие средства для получения размеров файлов, чем Java 5. Если Java 8 выпустила самый быстрый способ, это нормально.
Это не такпреждевременная оптимизация, на данный момент я оптимизирую проверку CRC с проверкой начального размера, потому что она должна быть намного быстрее и теоретически не нужно читать содержимое файла.Таким образом, я могу напрямую использовать «старый» метод Lenght
, и все, что я спрашиваю, это каковы новые достижения в этом отношении в современной Java, поскольку новые методы, по-видимому, не так быстры, как старые.