Последние способы получения размера файла в Java - PullRequest
0 голосов
/ 20 февраля 2019

Я знаю, что этот вопрос широко обсуждался в различных постах:

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

Как указано в этой странице :

Файлы имеют метод size () дляопределить размер файла.Это самый последний API, и он рекомендуется для новых приложений Java.

Но это, видимо, не лучший совет с точки зрения производительности.Я сделал разные измерения разными методами:

  1. file.length();

  2. Files.size(path);

  3. 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, поскольку новые методы, по-видимому, не так быстры, как старые.

...