当前位置: 首页 > 面试题库 >

Java中File.exists有多昂贵

龙弘盛
2023-03-14
问题内容

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

但是为了获得快速的预先信息:

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

我认为这将取决于文件系统,但是也许所有文件系统都使用快速方法?

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


问题答案:

首次执行此操作的方式完全取决于文件系统。这是由操作系统完成的,而Java则没有任何作用。

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

相比之下,OS和Java所做的其他一切都很简短。

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

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



 类似资料:
  • 问题内容: 我是一个初学者,我一直读到重复代码很不好。但是,为了避免这样做,您通常必须进行额外的方法调用。假设我有以下课程 对于我来说,将我的clear()方法中的两行复制并粘贴到构造函数中而不是调用实际方法会更好吗?如果是这样,有什么不同?如果我的构造函数进行了10个方法调用,每个方法仅将实例变量设置为一个值,该怎么办?什么是最佳编程实践? 问题答案: 对于我来说,将我的clear()方法中的两

  • 问题内容: 让我们转换为: 此转换操作的费用是多少?是否执行复制?据我在Go规范中所看到的: 字符串的行为就像字节的切片,但是是不可变的 ,这至少应该涉及复制,以确保后续的切片操作不会修改我们的字符串。反向对话会怎样?对话是否涉及编码/解码,如utf8 <->符文? 问题答案: 该不是铸造而是转换。有些转换与强制转换一样,只是重新解释了 原位 。不幸的是,这不是字符串到字节片转换的情况。字节片是可

  • 问题内容: 我无法想到该方法或Java 7中等效方法的实际用例。看来,或会在所有情况下最好(或,等等)。 例如,如何检查Java中是否存在文件?,第二个答案指出,接受的答案似乎很愚蠢。 任何人都可以举一个例子,在 不 知道某物是文件还是目录的 情况 下,知道某物存在是有用的吗? 编辑:我知道做什么。我的问题是,该功能 何时 能帮助某人?我正在搜索一个示例,例如“ 在_ _ _ _ _时使用,因为在

  • 问题内容: 我从没想过会发生这种情况,但是遇到了我的第一个Java错误: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=5003595 我几乎与错误(在Linux上为NFS)中描述的情况完全相同,并且我看到File.exists()没有返回正确的值(至少不是立即返回)。 所以我的问题是,这种检查文件是否存在的方法是否可以替代?如果可能的话,我

  • 问题内容: 我对Java真的很陌生,我读到Java 非常昂贵。我只想知道什么是昂贵的,它又如何昂贵? 谢谢。 问题答案: 也许还没有你想的那么糟 它曾经是可怕的(这可能就是您读到它“非常昂贵”的原因)。这些模因可能需要很长时间才能消失 由于涉及缓存刷新和失效的规则,因此Java语言中的同步块通常比许多平台提供的关键部分功能更为昂贵,而这些平台通常使用原子的“测试并设置位”机器指令来实现。即使程序仅

  • 问题内容: Windows XP上的JRE 6。 实例化具有不同构造函数的两个File对象会导致方法中的结果不一致。 免责声明: 下面的代码是抽象的,而不是实际的代码。 我根本不相信这是File.separator的问题。我首先要求早日做出反应,以防万一我错过了一个众所周知的问题。 现在看来,重置系统属性是导致此问题的原因之一。现在,下面的代码可以复制和使用。您可以复制/粘贴Java类并进行尝试,