12

我无法想到该方法的实际用例java.io.File.exists()或其在 Java 7 中的等价物java.nio.file.Files.exists(Path)。似乎isFile()orisDirectory()在所有情况下都更可取(或canRead(),canWrite()等)。

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

任何人都可以举一个例子,在不知道该事物是文件还是目录的情况下知道事物存在是有用的吗?

编辑:我明白是什么File.exists()。我的问题是,该功能何时可以帮助某人?我正在寻找一个示例,例如“File.exists()在 _ _ _ _ _ _ 时使用,因为在这种情况下既不增加File.isFile()也不File.isDirectory()增加任何价值。”


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

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

这听起来像是一个明确的二分法。但在更远的地方,医生反驳说,

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

我认为第三个文件系统对象的示例对文档有很大帮助。但该类别似乎连名字都没有,导致Files该类的 JavaDoc 措辞很尴尬:静态方法的集合,

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

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

4

3 回答 3

11

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

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

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

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

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

于 2016-07-27T18:23:50.063 回答
2

好吧,能够在参数中设置 LinkOptions 很方便。此调用的实际 API 是

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

您可能不想在您指定的文件路径中跟随符号链接。在这种情况下,调用 Files.exists(path) - 带有链接选项NOFOLLOW_LINKS,你就设置好了。

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

于 2014-06-23T17:19:03.547 回答
1

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

可能还检查缓存是否存在。缓存可以由不同的提供者实现,其中一些使用目录结构,而另一些使用 zip 文件(顺便说一下,我正在制作这个——我并不是说这是一个主意)。

于 2013-12-11T16:07:38.037 回答