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()
都将返回false
而File.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对象)时,使用静态方法也很不错。