在 Java 中获取文件大小的最新方法

use*_*544 8 java performance filesize java-11

我知道这个问题已在不同的帖子中广泛讨论:

我的问题是我需要获取大量文件(HD 中存在的常规文件)的大小,为此我需要一个提供最佳性能的解决方案。我的直觉是应该通过直接读取文件系统表的方法来完成,而不是通过读取整个文件内容来获取文件的大小。看文档很难知道具体使用了哪种方法。

本页所述

Files 有 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
.....
Run Code Online (Sandbox Code Playgroud)

Length是相当一致的。Files在第一次调用时明显慢,但它必须缓存一些东西,因为后来的调用速度更快(仍然比 慢Length)。这是其他人在我上面引用的一些链接中观察到的。BasicFileAttr是我的希望,但仍然很慢。

我正在考虑现代 Java 版本中推荐的内容,并且我认为 9/10/11 是“现代的”。这不是依赖,也不是限制,但我认为 Java 11 应该提供比 Java 5 更好的获取文件大小的方法。如果 Java 8 以最快的方式发布,那没关系。

这不是过早的优化,目前我正在使用初始大小检查优化 CRC 检查,因为它应该更快并且理论上不需要读取文件内容。所以我可以直接使用“旧”Length方法,我所要问的是现代 Java 在这方面的新进展是什么,因为新方法显然不如旧方法快。