NIO2.0新特性 Java Path实践.Path类包含了各式各样的方法,这些方法可以用来获取路径的,得到路径的元素,将路径转换成别的格式,提取路径的组成部分,还有一些方法做路径的匹配。这篇文章会讲到这些Path的方法,有时候称做语法操作,因为这些操纵是在Path本身进行的,不会关联文件系统。
包含如下章节:
- 创建一个Path对象
- 取得一个Path的信息
- 转换一个Path
- 合并两个Path
- 在连个Path之间创建一个Path
- 比较两个Path
创建一个Path对象
一个Path实例包含定位一个文件或者目录的信息。一个Path可能包含一系列的名称,可能包含一个跟元素或者一个文件名称当并不是必须的,一个Path可能只是由一个单独的目录或者文件名称组成。
用Paths帮助类的get方法,你可以很容易的创建一个Path对象:
1
2
3
|
Path p1 = Paths.get( "/tmp/foo" ); Path p2 = Paths.get(args[ 0 ]); |
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的相关信息:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
// 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:
12345// 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中删除尾部的”./”符号。
下面的例子都包含了冗余的路径信息:
12<pre>/home/./joe/foo
/home/sally/../joe/foo</pre>
常规的方法移除包含”.”或者”dir/..”。所有上面的例子都可以转成标准路基为/home/joe/foo。