# 什么是路径？ （和其他文件系统事实）

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

文件系统以某种形式存储和组织某种形式的媒体上的文件，通常是一个或多个硬盘驱动器，以便可以容易地检索它们。目前使用的大多数文件系统都将文件存储在树（或 _ 分层 _）结构中。在树的顶部是一个（或多个）根节点。在根节点下，有文件和目录（Microsoft Windows 中的 _ 文件夹 _）。每个目录都可以包含文件和子目录，而这些文件和子目录又可以包含文件和子目录，等等，可能达到几乎无限的深度。

本节包括以下内容：

*   [路径是什么？](#path)
*   [相对还是绝对？](#relative)
*   [符号链接](#symlink)

下图显示了包含单个根节点的示例目录树。 Microsoft Windows 支持多个根节点。每个根节点映射到一个卷，例如`C:\`或`D:\`。 Solaris OS 支持单个根节点，该节点由斜杠字符`/`表示。

<center>![Sample directory structure](img/b97c412825f946c5ba10ec251357ac38.jpg)

<center>Sample Directory Structure</center>

</center>

从根节点开始，文件通过文件系统的路径标识。例如，上图中的`statusReport`文件在 Solaris OS 中由以下表示法描述：

```
/home/sally/statusReport

```

在 Microsoft Windows 中，`statusReport`由以下表示法描述：

```
C:\home\sally\statusReport

```

用于分隔目录名称的字符（也称为 _ 分隔符 _）特定于文件系统：Solaris OS 使用正斜杠（`/`），Microsoft Windows 使用反斜杠斜杠（`\` ]）。

路径是 _ 相对 _ 或 _ 绝对 _。绝对路径始终包含查找文件所需的根元素和完整目录列表。例如，`/home/sally/statusReport`是绝对路径。查找文件所需的所有信息都包含在路径字符串中。

相对路径需要与另一个路径组合才能访问文件。例如，`joe/foo`是相对路径。如果没有更多信息，程序将无法在文件系统中可靠地找到`joe/foo`目录。

文件系统对象通常是目录或文件。每个人都熟悉这些对象。但是一些文件系统也支持符号链接的概念。符号链接也称为 _ 符号链接 _ 或 _ 软链接 _。

_ 符号链接 _ 是一个特殊文件，用作对另一个文件的引用。在大多数情况下，符号链接对应用程序是透明的，符号链接上的操作会自动重定向到链接的目标。 （指向的文件或目录称为链接的 _ 目标 _。）例外情况是删除符号链接或重命名，在这种情况下链接本身被删除，或重命名而不是目标链接。

在下图中，`logFile`似乎是用户的常规文件，但它实际上是`dir/logs/HomeLogFile`的符号链接。 `HomeLogFile`是链接的目标。

<center>![Sample symbolic link](img/7c21521b1b85e28bad8729d6d54af38a.jpg)

<center>Example of a Symbolic Link.</center>

</center>

符号链接通常对用户是透明的。读取或写入符号链接与读取或写入任何其他文件或目录相同。

解析链接的短语 _ 意味着用文件系统中的实际位置替换符号链接。在该示例中，解析`logFile`产生`dir/logs/HomeLogFile`。_

在实际场景中，大多数文件系统都可以自由使用符号链接。偶尔，粗心创建的符号链接可能会导致循环引用。当链接的目标指向原始链接时，会发生循环引用。循环引用可能是间接引用：目录`a`指向目录`b`，它指向目录`c`，其中包含指向目录`a`的子目录。当程序递归地遍历目录结构时，循环引用可能会导致严重破坏。但是，此方案已被考虑，并且不会导致程序无限循环。

下一页将讨论 Java 编程语言中文件 I / O 支持的核心，即`Path`类。