File.存在于 Java 中的昂贵程度

我想知道是如何工作的。我不太了解文件系统是如何工作的,所以我应该先开始阅读那里。File.exists()

但对于快速的预信息:

是否调用文件系统的单个操作(如果该路径和文件名已在某个日志中注册)?或者操作系统是否获取目录的内容,然后扫描其中的匹配项?File.exists()

我假设这将依赖于文件系统,但也许所有文件系统都使用快速方法?

我不是在谈论网络和磁带系统。让我们将其保留为ntfs,extX,zfs,jfs :-)


答案 1

测量必要的时间,看看自己。正如你所说,它绝对依赖于文件系统

        long t1 = System.currentTimeMillis();
        ...Your File.exists call
        long t2 = System.currentTimeMillis();
        System.out.println("time: " + (t2 - t1) + " ms");

您将看到它总是会给您不同的结果,因为它还取决于您的操作系统缓存数据的方式,负载等。


答案 2

如果第一次如何执行此操作,则完全取决于文件系统。这是由操作系统完成的,Java不起任何作用。

就性能而言,在所有情况下都需要读取磁盘。这通常需要 8-12 毫秒@Sven指出某些存储可能会变慢,但在性能很重要的情况下,这种情况相对较少见。如果这是一个网络文件系统(通常相对较小,但取决于您的网络延迟),则可能会有额外的延迟。

相比之下,操作系统和Java所做的其他一切都非常短。

但是,如果反复检查文件是否存在,则可能不需要磁盘访问,因为可以缓存信息,在这种情况下,操作系统花费的时间和资源。其中最大的对象之一 File.exists() 创建(你不会认为它会),但它在每次调用时都会对文件名进行编码,从而创建大量对象。如果你把File.exists()放在一个紧密的循环中,它每秒可以产生400MB的垃圾。:(

日志文件系统的工作方式不同,它跟踪您对文件系统所做的所有更改,但它们不会改变您读取文件系统的方式。