鍍金池/ 教程/ Java/ 15.Java NIO Path路徑
16. Java NIO Files
03. Java NIO Channel通道
06. Java NIO Channel to Channel Transfers通道傳輸接口
11. Java NIO: Non-blocking Server非阻塞服務(wù)器
01. Java NIO 教程
17. Java NIO AsynchronousFileChannel異步文件通道
09. Java NIO SocketChannel套接字通道
07. Java NIO Selector選擇器
08. Java NIO FileChannel文件通道
02. Java NIO 概覽
04. Java NIO Buffer緩沖區(qū)
10. Java NIO ServerSocketChannel服務(wù)端套接字通道
05. Java NIO Scatter / Gather
14. Java NIO vs. IO
13.Java NIO Pipe管道
12. Java NIO DatagramChannel數(shù)據(jù)報通道
15.Java NIO Path路徑

15.Java NIO Path路徑

原文鏈接:http://tutorials.jenkov.com/java-nio/path.html

Java的path接口是作為Java NIO 2的一部分是Java6,7中NIO的升級增加部分。Path在Java 7新增的。相關(guān)接口位于java.nio.file包下,所以Javaz內(nèi)Path接口的完整名稱是java.nio.file.Path.

一個Path實例代表一個文件系統(tǒng)內(nèi)的路徑。path可以指向文件也可以指向目錄。可以使相對路徑也可以是絕對路徑。絕對路徑包含了從根目錄到該文件(目錄)的完整路徑。相對路徑包含該文件(目錄)相對于其他路徑的路徑。相對路徑聽起來可能有點讓人頭暈。但是別急,稍后我們會詳細(xì)介紹。

不要把文件系統(tǒng)中路徑和環(huán)境變量的路徑混淆。java.nio.file.Path和環(huán)境變量沒有任何關(guān)系。

在很多情況下java.no.file.Path接口和java.io.File比較相似,但是他們之間存在一些細(xì)微的差異。盡管如此,在大多數(shù)情況下,我們都可以用File相關(guān)類來替換Path接口。

創(chuàng)建Path實例(Creating a Path Instance)

為了使用java.nio.file.Path實例我們必須創(chuàng)建Path對象。創(chuàng)建Path實例可以通過Paths的工廠方法get()。下面是一個實例:

import java.nio.file.Path;
import java.nio.file.Paths;

public classs PathExample {
  public static void mian(String[] args) {
    Path = path = Paths.get("c:\\data\\myfile.txt");
  }
}

注意上面的兩個import聲明。需要使用Path和Paths的接口,畢現(xiàn)先把他們引入。

其次注意Paths.get("c:\data\myfile.txt")的調(diào)用。這個方法會創(chuàng)建一個Path實例,換句話說Paths.get()是Paths的一個工廠方法。

創(chuàng)建絕對路徑(Creating an Absolute Path)

創(chuàng)建絕對路徑只需要調(diào)動Paths.get()這個工廠方法,同時傳入絕對文件。這是一個例子:

Path path = Paths.get("c:\\data\\myfile.txt");

對路徑是c:\data\myfile.txt,里面的雙斜杠\字符是Java 字符串中必須的,因為\是轉(zhuǎn)義字符,表示后面跟的字符在字符串中的真實含義。雙斜杠\表示\自身。

上面的路徑是Windows下的文件系統(tǒng)路徑表示。在Unixx系統(tǒng)中(Linux, MacOS,FreeBSD等)上述的絕對路徑長得是這樣的:

Path path = Paths.get("/home/jakobjenkov/myfile.txt");

他的絕對路徑是/home/jakobjenkov/myfile.txt。 如果在Windows機(jī)器上使用用這種路徑,那么這個路徑會被認(rèn)為是相對于當(dāng)前磁盤的。例如:

/home/jakobjenkov/myfile.txt

這個路徑會被理解其C盤上的文件,所以路徑又變成了

C:/home/jakobjenkov/myfile.txt

創(chuàng)建相對路徑(Creating a Relative Path)

相對路徑是從一個路徑(基準(zhǔn)路徑)指向另一個目錄或文件的路徑。完整路徑實際上等同于相對路徑加上基準(zhǔn)路徑。

Java NIO的Path類可以用于相對路徑。創(chuàng)建一個相對路徑可以通過調(diào)用Path.get(basePath, relativePath),下面是一個示例:

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

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

第一行創(chuàng)建了一個指向d:\data\projects的Path實例。第二行創(chuàng)建了一個指向d:\data\projects\a-project\myfile.txt的Path實例。 在使用相對路徑的時候有兩個特殊的符號:

  • .
  • ..

.表示的是當(dāng)前目錄,例如我們可以這樣創(chuàng)建一個相對路徑:

Path currentDir = Paths.get(".");
System.out.println(currentDir.toAbsolutePath());

currentDir的實際路徑就是當(dāng)前代碼執(zhí)行的目錄。 如果在路徑中間使用了.那么他的含義實際上就是目錄位置自身,例如:

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

上訴路徑等同于:

d:\data\projects\a-project

..表示父目錄或者說是上一級目錄:

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

這個Path實例指向的目錄是當(dāng)前程序代碼的父目錄。 如果在路徑中間使用..那么會相應(yīng)的改變指定的位置:

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

這個路徑等同于:

d:\data\projects\another-project

.和..也可以結(jié)合起來用,這里不過多介紹。

Path.normalize()

Path的normalize()方法可以把路徑規(guī)范化。也就是把.和..都等價去除:

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);

這段代碼的輸出如下:

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