摘自开发者的天空
1. Path 的概念
文件系统会把文件进行组织并存放在媒介上,通常是一个或多个硬盘上。目前使用的大多数的文件系统是以树形的方式来存储文件的。在树的顶端是一个(或多个) 根节点,在根节点之下是文件和目录,目录下又可以包含文件和目录。理论上可以这样一层层的一直嵌套下去(当然实际中是不可能的,例如Windows系统对 路径的长度有限制)。
下面的图中展示了一个包含一个根节点的目录树。(在Windows系统中支持多个根节点,例如C:\和D:\分别是一个根节点。)
Path能够唯一的标识文件系统中的某一个文件。例如上面图中的statusReport文件在Windows系统中就可以使用以下的Path来标识:
c:\home\sally\statusReport
在solaris系统中,其path为
/home/sally/statusReport.
Path中的分隔符在不同的文件系统中是不同的,例如在Windows系统中使用\,在Solaris系统中使用/。
Path又可以分为绝对路径和相对路径。绝对路径总是含有根节点和用来定位文件的完整的目录列表。例如/home/sally/statusReport 就是绝对路径。相对路径需要和另外的路径结合在一起才能够确定一个文件。例如加哦加哦哦joe/foo就是一个相对路径,如果没有其他的信息,程序就没有 办法定位这个文件。我们必须说这个是相对/home的相对路径,这样我们才能够找到它。
除了我们熟悉的目录和文件之外,有一些文件系统中还支持符号链接(symbolic link),也称为symlink或soft link。一个符号链接是一个特殊的文件,它实际上是另外一个链接的引用。在大多数情况下符号链接对应用程序是透明的,对符号链接的操作会自动的重定向到 链接所指向的目的地,除非操作是删除这个符号链接、重命名这个符号链接或修改符号链接的目的地。
在下面的图中,logFile对于用户来说就是一个常规的文件,但是实际上是一个符号链接,链接到dir/logs/HomeLogFile文件。 HomeLogFile是这个链接的目的地。
不恰当的使用符号链接会导致循环引用,例如目录A是一个符号链接,指向目录B,目录B下有一个子目录是符号链接,指向目录A的父目录。这样,当程序企图递 归的遍历整个目录树时,就会出问题。幸运的是,这个问题已经被发现了,并且不会导致程序的死循环。
2.Path类
Path类是JDK7新引入的一个类,该类是java.nio.file包的基石。
和类的名称所展示的一样,Path类就是文件系统中path概念的程序表现。Path对象包含了文件名和目录列表,这些信息可以用来创建path,并且用 来检验、定位和操作文件。
Path实例是和底层操作系统相关的。在Solaris系统中,Path使用Solaris的句法(/home/joe/foo);在Window操作系 统中,Path会使用Window的句法(C:\home\joe\foo)。因此Path不是操作系统无关的。你不能够比较一个来自Solaris文件 系统的Path和一个来自Windows文件系统的Path并期望它们相等,在目录结构和文件完全一样的时候也不行。
Path对应的文件或者目录可以不存在。我们可以以不同的方式创建Path实例并操作它:扩展路径、抽取路径的一部分、和其他的Path比较。我们也可以 检查Path对应的目录或文件是否存在、创建文件 或目录、打开或删除文件、修改许可权限等。
Path类是能够区分符号链接的。所有的Path的方法要么会检测是否是符号链接并执行不同的操作,或者提供了一个选择来使用户能够配置当遇到符号链接的 时候执行什么操作。
Path类提供了很多易于使用的特性,Path类的方法可以分成两类:
- 路径操作—返回路径的一部分如根节点、名称、父目录的方法或者其他操作路径的方法。
- 文件操作 —创建文件、打开文件、创建目录、删除文件、 拷贝文件等操作的方法。
在下一篇文章中,我们会具体介绍Path类的这些方法。