NIO2.0新特性 Java Path实践



NIO2.0新特性 Java Path实践Path类包含了各式各样的方法,这些方法可以用来获取路径的,得到路径的元素,将路径转换成别的格式,提取路径的组成部分,还有一些方法做路径的匹配。这篇文章会讲到这些Path的方法,有时候称做语法操作,因为这些操纵是在Path本身进行的,不会关联文件系统。

包含如下章节:
创建一个Path对象
取得一个Path的信息
转换一个Path
合并两个Path
在连个Path之间创建一个Path
比较两个Path
创建一个Path对象
一个Path实例包含定位一个文件或者目录的信息。一个Path可能包含一系列的名称,可能包含一个跟元素或者一个文件名称当并不是必须的,一个Path可能只是由一个单独的目录或者文件名称组成。
用Paths帮助类的get方法,你可以很容易的创建一个Path对象:

Path p1 = Paths.get(“/tmp/foo”);
Path p2 = Paths.get(args[0]);
Path p3 = Paths.get(URI.create(“file:///Users/joe/FileTest.java”));
Paths.get方法实际调用了下面代码的:
1
Path p4 = FileSystems.getDefault().getPath(“/users/sally”);
下面的例子,如果在Linux系统你的home目录是/u/joe,那将会创建/u/joe/logs/foo.log。如果是Windows系统则将会创建C:\joe\logs\foo.log。
1
Path p5 = Paths.get(System.getProperty(“user.home”),”logs”, “foo.log”);
取得一个Path的信息
你可以认为Path就是一个存储名称元素的序列。在目录结构中最顶层的元素标记为为0个。在目录结构中最底层的元素标记为第[n - 1],n表示在Path的层次结构中的层次数量。有一些方法可以通过标记位获取指定的元素或者Path的子序列。
在的例子中使用了如下的目录结构。

简单目录结构
下面的代码片段定义了一个Path实例,调用了一些方法去获取Path的相关信息:

// None of these methods requires that the file corresponding
// to the Path exists.
// Microsoft Windows syntax
Path path = Paths.get(“C:\\home\\joe\\foo”);

// Solaris syntax
Path path = Paths.get(“/home/joe/foo”);

System.out.format(“toString: %s%n”, path.toString());
System.out.format(“getFileName: %s%n”, path.getFileName());
System.out.format(“getName(0): %s%n”, path.getName(0));
System.out.format(“getNameCount: %d%n”, path.getNameCount());
System.out.format(“subpath(0,2): %s%n”, path.subpath(0,2));
System.out.format(“getParent: %s%n”, path.getParent());
System.out.format(“getRoot: %s%n”, path.getRoot());
这里有Window和Solaris两个系统的输出项对比:
方法调用 Solaris的返回值 Windows的返回值 备注
toString /home/joe/foo C:\home\joe\foo 返回Path的字符串表示,如果Path是用Filesystems.getDefault().getPath(String)或者Paths.get,方法执行会自动修复清理,比如,在Unix操作系统中,会将输入的字符串//home/joe/foo修正为/home/joe/foo。
getFileName foo foo 返回文件名称或者在名称序列元素中的最后一个元素
getName(0) home home 返回Path元素对应标记的元素。第0个元素是Path元素中最近进跟节点的元素
getNameCount 3 3 返回Path所有元素的数量
subpath(0,2) home/joe home\joe 返回不包含根元素的子序列,传入开始位置和结束位置作为方法的参数
getParent /home/joe \home\joe 返回Path的父目录
getRoot / \ 返回根路径
上面的例子展示了绝对路径Path的输出。在跟着的例子,将会详细介绍相对位置的Path:

// Solaris syntax
Path path = Paths.get(“sally/bar”);
or
// Microsoft Windows syntax
Path path = Paths.get(“sally\\bar”);
这里有Windows和Solaris的输出比较:
方法调用 Solaris的返回值 Windows的返回值 备注
toString sally/bar sally\bar 返回Path的字符串表示,如果Path是用Filesystems.getDefault().getPath(String)或者Paths.get,方法执行会自动修复清理,比如,在Unix操作系统中,会将输入的字符串//home/joe/foo修正为/home/joe/foo。
getFileName bar bar 返回文件名称或者在名称序列元素中的最后一个元素
getName(0) sally sally 返回Path元素对应标记的元素。第0个元素是Path元素中最近进跟节点的元素
getNameCount 2 2 返回Path所有元素的数量
subpath(0,2) sally sally 返回不包含根元素的子序列,传入开始位置和结束位置作为方法的参数
getParent sally sally 返回Path的父目录
getRoot null null 返回根路径
从Path中移除冗余的路径
很多文件系统使用”.”符号表示当前目录,使用”..”符号表示父目录。你可能遇到过这样的情况,一个路径中包含了冗余的目录信息。有可能是这样的情况,一个服务器配置了保存它的日志文件在”/dir/logs/.”目录中,你想从Path中删除尾部的”./”符号。
下面的例子都包含了冗余的路径信息:

<pre>/home/./joe/foo
/home/sally/../joe/foo</pre>
常规的方法移除包含”.”或者”dir/..”。所有上面的例子都可以转成标准路基为/home/joe/foo。