使用Java获取文件大小的最新方法

时间:2019-02-20 13:33:32

标签: java performance filesize java-11 java-10

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

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

this page中所述:

  

文件具有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在这方面的最新进展,因为新方法显然不如旧方法快。 >

0 个答案:

没有答案