我无法想到方法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将这些其他类型称为“特殊文件”。这似乎对我很敏感。他们是如此特别,我不知道他们存在。
答案 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),然后重新设置。
当您不想在空间中创建比您需要的更多对象(如瞬态文件对象)时,使用静态方法也很不错。