JAVA NIO Path

原文链接:JAVA NIO Path 作者:Jakob Jenkov


Java中Path的接口是JAVA NIO2更新中的一部分,JAVA NIO是在JAVA 6和JAVA 7中修订的。JAVA中的Path接口是在JAVA 7中被加入到JAVA NIO中的。Path接口在java.nio.file包下,它的全名为java.nio.file.Path.

一个path的实例表示的是文件系统中的一个路径,这个路径不仅能指向一个文件,还能指向一个目录,这个路径同样可以是绝对路径也可以是相对路径。绝对路径包含全部的路径,从文件系统的根目录一直到它所指向的那个文件或者目录。相对路径包含一个文件或者目录的路径,这个路径是相对于其他路径的。相对路径可能会有些疑惑,别担心,一会儿我会在本节中更加详细的介绍文件的相对路径。

不要将一个文件的系统路径和操作系统的环境变量混淆,java.nio.file.Path接口和环境变量没有任何关系。

在很多情况下,java.nio.file.Path接口和java.io.File类很相似,但是它们之间还有一些其他次要的区别。尽管在很多情况下,你可以使用Path接口来替代使用FIle类。

创建一个Path实例

为了使用java.nio.file.Path实例,你必须创建一个Path实例。你可以使用Paths类中的一个静态方法Paths.get()来创建一个Path实例。这是一个例子:

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”)。这就是通过调用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 Path 类同样可以使用相对路径来工作,你可以通过调用Paths.get(basePath,relativePath)方法来创建一个相对路径。这里是java中两个相对路径的实例:

Path projects = Paths.get("d:\\data", "projects");

Path file     = Paths.get("d:\\data", "projects\\a-project\\myfile.txt");

第一个例子创建了一个指向d:\data\projects的Path的实例,第二个例子创建了一个指向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");

这个path实例对应的路径就是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之后的“…”将目录向上一级,更改为projects,接着路径又从这个位置向下指到了another-project的目录。
这个“.”和“…”同样可以在两个参数的Paths.get()方法中使用,这里有两个使用了Paths.get()的java的示例:

Path path1 = Paths.get("d:\\data\\projects", ".\\a-project");

Path path2 = Paths.get("d:\\data\\projects\\a-project",
                       "..\\another-project");

Path.normalize()

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实例上调用了normalize()方法,返回一个Path实例,同样打印这个新的已经归一化的Path实例。
下面是上述例子的输出:

path1 = d:\data\projects\a-project\..\another-project
path2 = d:\data\projects\another-project

正如你所看到的,归一化的路径不含“a-project…”这一部分,因为这一部分是冗余 的,移除的部分和最后得到的绝对路径毫无关系。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值