Path表示的是一个目录名序列,其后还可以跟着一个文件名。路径中的第一个部件可以是根部件,例如/
或C:\
,而允许访问的根部件取决于文件系统。
以根部件开始的路径是绝对路径;否则,就是相对路径。
例如,我们要分别创建一个绝对路径和一个相对路径;其中,对于绝对路径,我们假设计算机运行的是类Unix的文件系统:
Path absolute = Paths.get("/Users", "acton_zhang");
Path relative = Paths.get("pers", "zhang", "ThreadDemo.java");
静态的Paths.get方法接受一个或多个字符串,并将他们用默认文件系统的路径分隔符(类Unix文件系统是/
,Windows是\
)连接起来。然后解析连接起来的结果,如果其表示的不是给定文件系统中的合法路径,那么就抛出InvalidPathException
异常。这个连接起来的结果就是一个Path对象。
get方法可以获取包含多个部件构成的单个字符串,例如,可以像下面这样从配置文件中读取路径:
String baseDir = props.getProperty("base.dir");
//May be a string such as /opt/myprog or c:\Program Files\myprog
Path basePath = Paths.get(baseDir);
注意:
路径不必对应者某个实际存在的文件,它仅仅只是一个抽像的名字序列。
组合或解析路径是司空见惯的操作,调用p.resolve(q)将按照下列规则返回一个路径:
Path absolute = Paths.get("/Users", "acton_zhang");
Path relative = Paths.get("pers", "zhang", "ThreadDemo.java");
System.out.println(absolute);
System.out.println(relative);
System.out.println(absolute.resolve("/bin"));
System.out.println(absolute.resolve("bin"));
//输出:
/Users/acton_zhang
pers/zhang/ThreadDemo.java
/bin
/Users/acton_zhang/bin
假设你的应用系统需要查找相对于给定基目录的工作目录,其中基目录是从配置文件中读取的,就像前面一样:
Path workRelative = Paths.get("work");
Path workPath = basePath.resolve(workRelative);
resolve方法有一种快捷方式,它接受一个字符串而不是路径:
Path workPath = basePath.resolve("work");
还有一个很方便的方法resolveSibling
它通过解析路径的父路径产生其兄弟路径:
Path workPath = Paths.get("/opt", "myapp", "word");
Path temp = workPath.resolveSibling("temp");
System.out.println(temp);///opt/myapp/temp
resolve的对立面是relativize
,即调用p.relativize®将产生路径q,而对q进行解析的结果正是r,例如:以『/home/cay』为目标对『/home/fred/myprog』进行相对化操作,会产生『…/fred/myprog』:
Path p = Paths.get("/home", "cay");
Path r = Paths.get("/home/fred/myprog");
Path q = p.relativize(r);
System.out.println(q);//../fred/myprog
normalize
方法将移出所有冗余的.
和..
部件(或者文件系统认为冗余的所有部件),例如:规范化『/home/cay/…/fred/./myprog』将产生『/home/fred/myprog』
Path path = Paths.get("/home/cay/../fred/./myprog");
Path normalize = path.normalize();
System.out.println(normalize);///home/fred/myprog
toAbsolutePath
方法将产生给定路径的绝对路径,该绝对路径从根部件开始:
Path relative = Paths.get("pers", "zhang", "ThreadDemo.java");
Path path1 = relative.toAbsolutePath();
System.out.println(path1);///Users/acton_zhang/J2EE/SpringCloudWorkSpace/FunctionalProgramming/pers/zhang/ThreadDemo.java
注意:
偶尔,可能需要与遗留系统的API交互,它们使用的是File类而不是Path接口。Path接口有一个toFile方法,而File类有一个toPath方法。
java.nio.file.Paths
public static Path get(String first, String... more)
java.nio.file.Path 7
Path resolve(Path other)
Path resolve(String other)
如果other是绝对路径,那么就返回other;否则,返回通过连接this和other获得的路径;
Path resolveSibling(Path other)
Path resolveSibling(String other)
如果other是绝对路径,那么就返回other;否则,返回通过连接this的父路径和other获得的路径;
Path relativize(Path other)
返回用this进行解析,相对于other的相对路径;
Path normalize()
移出诸如 . 和 … 等冗余的路径元素
Path toAbsolutePath()
返回与该路径等价的绝对路径
Path getParent()
返回父路径,或者在该路径没有父路径时,返回null
Path getFileName()
返回该路径的最后一个不见,或者在该路径没有任何部件时,返回null
Path getRoot()
返回该路径的根部件,或者在该路径没有任何根部件时,返回null
toFile()
从该路径中创建一个File对象
java.io.File 1.0
Path toPath() 7