Path

Java的Path接口是Java NIO在Java6和Java7两次更新的一部分。Java的Path接口是在Java7中加入Java NIO的。Path接口在java.nio.file包下,所以Path接口的权限定名是java.nio.file.Path

一个Path实例代表文件系统的一个路径。一个路径可以指向一个文件或一个目录。路径是相对路径或绝对路径。绝对路径包括了从文件系统的根路径到其指向的文件或目录的全路径。相对路径包含了一个文件或目录相对于其他路径的路径。相对路径听起来可能有点混乱。不用担心,我会在本教程中详细介绍相对路径。

不要把文件系统路径和一些操作系统中的path环境变量搞混了。java.nio.file.Path接口和path环境变量一点关系都没有。

java.nio.file.Path在许多方面都和java.io.File很相似,但也有一些细微的差别。在许多情况下,你都可以用Path来代替File

Creating a Path Instance

在使用java.nio.file.Path之前,你必须先创建一个Path实例。你可以通过Paths(java.nio.file.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类之前,我们需要先import它们。

第二,注意Paths.get("c:\\data\\myfile.txt")这句方法调用。通过Paths.get()的方法调用,我们创建了一个Path实例。换句话说,Paths.get()方法是生产Path实例的工厂方法。

Creating an Absolute 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

Creating a Relative Path

相对路径是从一个路径(基准路径)指向一个文件或目录的路径。其完整路径(绝对路径)是由基准路径和相对路径结合而来的。

Java NIO的Path类也能处理相对路径。通过调用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(目录)的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");

该路径等同于下面的路径:

d:\data\projects\a-project

“..”代表父目录或上级目录。看下面例子:

Path parentDir = Paths.get("..");

这个例子创建的Path实例与启动运行这些代码的程序的目录的父目录对应。

如果你在路径字符串中间使用“..”,它会在那个地方向上移动一个目录。比如:

String path = "d:\\data\\projects\\a-project\\..\\another-project";
Path parentDir2 = Paths.get(path);

这个例子创建的Path实例与下面的路径对应:

d:\data\projects\another-project

a-project之后的“..”让整个路径向上移动到了projects目录,然后从那开始引用到another-project目录。

“.”和“..”也可以在有两个String参数的Paths.get()方法中使用。以下是两个简单的例子:

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

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

Java NIO还有很多方法来处理相对路径。稍微你会看到。

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.toString())。

然后例子调用了创建的Path实例的normalize()方法,并返回了一个新的Path实例。然后这个新的、标准化的Path实例也被打印了出来。

这是上面的例子打印出来的结果:

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

如你所见,标准化的路径没有包含a-project..,因为这是多余的。删除的部分对最终的路径没有任何作用。

发现貌似有人在看这个系列文章了,有必要说明下,这个Java NIO系列来源于jenkov.com,本文只是翻译,希望大家千万不要误会,本文不是原创。原文地址:Java NIO

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,240评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,328评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,182评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,121评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,135评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,093评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,013评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,854评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,295评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,513评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,678评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,398评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,989评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,636评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,801评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,657评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,558评论 2 352