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

时间:2013-12-11 15:33:53

标签: java java-io java.nio.file

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

例如,在How do I check if a file exists in Java?中,接受的答案似乎很愚蠢,正如第二个答案所指出的那样。

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

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


回想起来,我认为我的混淆是关于File类的JavaDoc中两个看似矛盾的陈述。第一句将类定义为

  

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

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

  

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

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

  

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

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

3 个答案:

答案 0 :(得分:6)

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

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

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

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

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

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

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

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

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