《Java NIO教程》Java NIO Path
原文链接 作者:Jakob Jenkov 译者:黄国鹏
Java的Path接口是Java NIO2 的一部分,是对Java6 和Java7的 NIO的更新。Java的Path接口在Java7 中被添加到Java NIO,位于java.nio.file包中, 其全路径是java.nio.file.Path。
一个Path实例代表了一个文件系统中的路径。一个路径可以指向一个文件或者一个文件夹。一个路径可以是绝对路径或者是相对路径。绝对路径是从根路径开始的全路径,相对路径是一个相对其他路径的文件或文件夹路径。相对路径可能会造成一点混乱,但是不要担心,在本文章中,我会详细解释相对路径的。
不要混淆了文件系统中的路径 和 操作系统中环境变量的path路径。java.nio.file.Path实例与环境变量中的path没有任何关系。
在很多地方java.nio.file.Path接口和java.io.File类是相似的,但是它们有几个主要的不同。 在很多类中,你可以使用Path 接口替换 file 类使用。
创建一个Path实例
要想使用 一个 Path实例,你必须要先创建一个Path实例,可以使用Paths类 (java.nio.file.Paths)中的静态方法 Path.get()创建。 下面是一个例子
import java.nio.file.Path;
import java.nio.file.Paths;
public class PathExample {
public static void main(String[] args) {
Path path = Paths.get("c:\\data\\myfile.txt");
}
}
注意例子中两个import语句,为了能够适应Path实例和Paths类,必须要引入它们。 其次,注意Paths.get(“c:\data\myfile.txt”)方法的调用,这个方法是创建一个Path实例。 换句话说,Paths.get() 方法是一个创建Path实例的工厂方法。
创建一个绝对路径
以绝对路径文件作为参数调用Paths.get()工厂方法后就是创建一个绝对Path实例,例子如下
Path path = Paths.get("c:\\data\\myfile.txt");
c:\data\myfile.txt就是绝对路径,由于java中一个 \ 是转义字符,所以要写成两个 \ ,\就是告诉java编译器变成一个 \ 放到字符串中。
上面的是Windows操作系统中写法,在Unix操作系统中(Linux, MacOS, FreeBSD 等等),上面路径类似写成:
Path path = Paths.get("/home/jakobjenkov/myfile.txt");
现在绝对路径是 /home/jakobjenkov/myfile.txt
如果你在windows系统中使用 以 / 开头的路径,那么就会被理解为相对于当前驱动器,
/home/jakobjenkov/myfile.txt
会从C盘根目录开始解析,最终的全路径就是:
C:/home/jakobjenkov/myfile.txt
##创建一个相对路径
相对路径是指以一个路径(基本路径)指向 一个文件或者文件夹的路径,它的绝对路径会结合基本路径推算 出来。
Java NIO Paths类也可以用来创建相对路径的实例。你可以是使用Paths.get(basePath, relativePath)方法创建一个相对路径的实例。
Path projects = Paths.get("d:\\data", "projects");
Path file = Paths.get("d:\\data", "projects\\a-project\\myfile.txt");
第一行代码是创建一个指向 d:\data\projects 文件夹路径的 实例,第二行代码是创建一个 指向d:\data\projects\a-project\myfile.txt文件路径的实例。
当使用相对路径使用,有两个特别的符号可以被包含在路径的字符串中,符号如下:
- .
- ..
“.” 代表当前目录,如果你创建一个相对Path实例:
Path currentDir = Paths.get(".");
System.out.println(currentDir.toAbsolutePath());
上面例子中Path实例的绝对路径就是该代码运行时的目录的绝对路径。
如果 . 在 路径字符串的中间位置,就是指向同一个目录(译者注:就相当于不加 . 一样),例子:
Path currentDir = Paths.get("d:\\data\\projects\.\a-project");
上面路径就是和下面路径一致
d:\data\projects\a-project
.. 代表父目录或者是上一级目录,示例:
Path parentDir = Paths.get("..");
上面例子中Path实例的绝对路径就是该代码运行时的父目录的绝对路径。
如果 .. 在路径字符串的中间位置,相当于指向了上一级目录,例子:
String path = "d:\\data\\projects\\a-project\\..\\another-project";
Path parentDir2 = Paths.get(path);
上面路径和下面路径一致
d:\data\projects\another-project
a-project后面的 .. 改变了目录指向上一级父目录 project ,然后再参照 父目录project,指向下一级目录another-project
. 和 .. 可以在Paths.get() 方法中结合使用,示例
Path path1 = Paths.get("d:\\data\\projects", ".\\a-project");
Path path2 = Paths.get("d:\\data\\projects\\a-project",
"..\\another-project");
Path.normalize()方法
Path接口中的normalize()可以标准化一个路径。标准化意思是解析路径中的. 和 .. 。例子如下:
String originalPath =
"d:\\data\\projects\\a-project\\..\\another-project";
Path path1 = Paths.get(originalPath);
System.out.println("path1 = " + path1);
Path path2 = path1.normalize();
System.out.println("path2 = " + path2);
代码开始使用.. 创建Path实例,使用路径字符串创建实例后,并把Path实例打印出来(也就是调用Path.toString()方法)。
调用创建的Path实例后,返回一个新的Path实例,这个新的,标准的Path实例最后也打印出来。
上面代码打印的内容如下:
path1 = d:\data\projects\a-project\..\another-project
path2 = d:\data\projects\another-project
我们可以看到规范化的路径没有包含a-project..多余的部分,移除的部分对于绝对路径是无关紧要的。
原创文章,转载请注明: 转载自并发编程网 – ifeve.com本文链接地址: 《Java NIO教程》Java NIO Path
看原文,relativize() 分析路径间相对路径的方法缺少了