Java File.exists()与File.isFile()

我无法想到java.io.File.exists()方法的实际用例或Java 7 java.nio.file.Files.exists(Path)等价方法。 似乎isFile()isDirectory()在所有情况下都是首选(或canRead()canWrite()等)。

例如,在如何检查Java中是否存在文件? ,第二个答案指出,接受的答案似乎很愚蠢。

任何人都可以给出一个例子,知道事物是否存在是有用的, 而不知道事物是文件还是目录?

编辑:我理解File.exists()作用。 我的问题是,该function什么时候可以帮助某人? 我正在搜索一个例子,“在_ _ _ _ _ _时使用File.exists() ,因为在这种情况下, File.isFile()File.isDirectory()不会添加任何值。”


回想起来,我认为我在这里的困惑是关于File类的JavaDoc中两个看似矛盾的语句。 第一句将类定义为,

文件和目录路径名的抽象表示。

这听起来像是一个明显的二分法; 但进一步说,医生反驳,

此类的实例可能表示也可能不表示实际的文件系统对象,例如文件或目录。

我认为第三个文件系统对象的例子在文档中会有很大的帮助; 但是这个类别似乎甚至缺少一个名称,导致JavaDoc对于Files类的尴尬措辞:静态方法的集合,

对文件,目录或其他类型的文件进行操作。

在接受的答案中,@ korral将这些其他类型称为“特殊文件”。 这似乎对我很敏感。 他们是如此特别,我不知道他们存在。

回答@ jaco0646的最后一个问题:

在处理命名管道,套接字或设备文件等特殊文件时使用File.exists()

这些不是常规文件,也不是目录和符号链接,因此File.isFile()File.isDirectory()都将返回falseFile.exists()将返回true 。 例如/dev/null (在Unix兼容的操作系统上)是一个设备文件。

从理论上讲,处理大量文件时可能会出现性能差异。 这还取决于文件系统,JVM实现细节,操作系统等。

例如。 在Android上File.exists()是使用access()系统调用实现的,而File.isFile() / File.isDirectory()使用stat() 。 在这种情况下,处理stat()输出在用户空间中需要比access()更多的逻辑。

我能想到的唯一用例是锁定文件或类似的用例。 文件是常规文件还是目录的时间并不重要,仅存在具有该名称的内容就足以触发程序行为。

可能还会检查缓存是否存在。 缓存可以由不同的提供程序实现,其中一些使用目录结构,其中一些使用zip文件(顺便说一句,我正在进行此操作 – 我不是说这是一个主意)。

能够在参数中设置LinkOptions是一种方便。 此调用的实际API是

 static java.nio.file.Files.exists(Path path, LinkOption... options) 

您可能不希望在指定的文件路径中跟随符号链接。 在这种情况下,调用Files.exists(path) – 使用链接选项NOFOLLOW_LINKS ,然后进行设置。

当您不想在空间中创建比您需要的更多对象(如瞬态File对象)时,使用静态方法也很不错。