# 检查文件或目录

> 原文： [https://docs.oracle.com/javase/tutorial/essential/io/check.html](https://docs.oracle.com/javase/tutorial/essential/io/check.html)

您有`Path`实例表示文件或目录，但文件系统上是否存在该文件？它可读吗？可写？可执行文件？

`Path`类中的方法是语法的，这意味着它们在`Path`实例上运行。但最终您必须访问文件系统以验证特定`Path`是否存在或不存在。您可以使用 [`exists(Path, LinkOption...)`](https://docs.oracle.com/javase/8/docs/api/java/nio/file/Files.html#exists-java.nio.file.Path-java.nio.file.LinkOption...-) 和 [`notExists(Path, LinkOption...)`](https://docs.oracle.com/javase/8/docs/api/java/nio/file/Files.html#notExists-java.nio.file.Path-java.nio.file.LinkOption...-) 方法进行此操作。请注意，`!Files.exists(path)`不等同于`Files.notExists(path)`。当您测试文件存在时，可能会有三个结果：

*   该文件已验证存在。
*   该文件已验证不存在。
*   文件的状态未知。当程序无权访问该文件时，可能会发生此结果。

如果`exists`和`notExists`都返回`false`，则无法验证文件是否存在。

要验证程序是否可以根据需要访问文件，可以使用 [`isReadable(Path)`](https://docs.oracle.com/javase/8/docs/api/java/nio/file/Files.html#isReadable-java.nio.file.Path-) ， [`isWritable(Path)`](https://docs.oracle.com/javase/8/docs/api/java/nio/file/Files.html#isWritable-java.nio.file.Path-) 和 [`isExecutable(Path)`](https://docs.oracle.com/javase/8/docs/api/java/nio/file/Files.html#isExecutable-java.nio.file.Path-) 方法。

以下代码段验证特定文件是否存在以及程序是否能够执行该文件。

```
Path file = ...;
boolean isRegularExecutableFile = Files.isRegularFile(file) &
         Files.isReadable(file) & Files.isExecutable(file);

```

* * *

**Note:** Once any of these methods completes, there is no guarantee that the file can be accessed. A common security flaw in many applications is to perform a check and then access the file. For more information, use your favorite search engine to look up `TOCTTOU` (pronounced _TOCK-too_).

* * *

当您有一个使用符号链接的文件系统时，可能有两个不同的路径来定位同一个文件。 [`isSameFile(Path, Path)`](https://docs.oracle.com/javase/8/docs/api/java/nio/file/Files.html#isSameFile-java.nio.file.Path-java.nio.file.Path-) 方法比较两个路径以确定它们是否在文件系统上找到相同的文件。例如：

```
Path p1 = ...;
Path p2 = ...;

if (Files.isSameFile(p1, p2)) {
    // Logic when the paths locate the same file
}

```