目錄
- Java NIO教程
- Java NIO 教程(一) 概述
- Java NIO 教程(二) Channel
- Java NIO 教程(三) Buffer
- Java NIO 教程(四) Scatter/Gather
- Java NIO 教程(五) 通道之間的數據傳輸
- Java NIO 教程(六) Selector
- Java NIO 教程(七) FileChannel
- Java NIO 教程(八) SocketChannel
- Java NIO 教程(九) ServerSocketChannel
- Java NIO 教程(十) 非阻塞式服務器
- Java NIO 教程(十一) Java NIO DatagramChannel
- Java NIO 教程(十二) Pipe
- Java NIO 教程(十三) Java NIO vs. IO
- Java NIO 教程(十四) Java NIO Path
- Java NIO 教程(十五) Java NIO Files
- Java NIO 教程(十六) Java NIO AsynchronousFileChannel
Java Path接口是Java NIO 2更新的一部分,同Java NIO一起已經包括在Java6和Java7中。Java Path接口是在Java7中添加到Java NIO的。Path接口位于java.nio.file
包中,所以Path接口的完全限定名稱為java.nio.file.Path
。
Java Path實例表示文件系統中的路徑。一個路徑可以指向一個文件或一個目錄。路徑可以是絕對路徑,也可以是相對路徑。絕對路徑包含從文件系統的根目錄到它指向的文件或目錄的完整路徑。相對路徑包含相對于其他路徑的文件或目錄的路徑。相對路徑可能聽起來有點混亂。別擔心。我將在稍后的Java NIO路徑教程中詳細解釋相關路徑。
不要將文件系統路徑與某些操作系統中的path環境變量混淆。java.nio.file.Path
接口與path環境變量沒有任何關系。
在許多方面,java.nio.file.Path
接口類似于java.io.File
類,但是有一些細微的差別。不過,在許多情況下,您可以使用Path
接口來替換File
類的使用。
創建一個Path實例
為了使用java.nio.file.Path
實例必須創建一個Path
實例。您可以使用Paths
類(java.nio.file.Paths
)中的靜態方法來創建路徑實例,名為Paths.get()
。下面是一個Java Paths.get()
示例:
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");
}
}
請注意示例頂部的兩個導入語句。要使用Path
接口和Paths
類,我們必須首先導入它們。
其次,注意Paths.get("c:\\data\\myfile.txt")
方法調用。它是調用Path
實例的Paths.get()
方法。換句話說,Paths.get()
方法是Path
實例的工廠方法。
創建一個絕對路徑
創建絕對路徑是通過調用Paths.get()
工廠方法,給定絕對路徑文件作為參數來完成的。下面是創建一個表示絕對路徑的路徑實例的例子:
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");
第一個例子創建了一個Java Path
的實例,指向路徑(目錄):d:\data\projects
,第二個例子創建了一個Path
的實例,指向路徑(文件):d:\data\projects\a-project\myfile.txt
當在工作中使用相對路徑時,你可以在你的路徑字符串中使用兩個特殊代碼,它們是:
.
..
代碼.
表示“當前目錄”,例如,如果你創建了這樣一個相對路徑:
Path currentDir = Paths.get(".");
System.out.println(currentDir.toAbsolutePath());
然后,Java Path
實例對應的絕對路徑將是執行上述代碼的應用程序的目錄。
如果。在路徑字符串的中間使用.
,表示同樣的目錄作為路徑指向那個點。這里有一個例子說明了這一點:
Path currentDir = Paths.get("d:\\data\\projects\.\a-project");
這條路徑將對應于路徑:
d:\data\projects\a-project
..
表示“父目錄”或者“上一級目錄”,這里有一個Path的Java例子表明這一點:
Path parentDir = Paths.get("..");
這個例子創建的Path
實例對應于運行該代碼的應用程序的父目錄。
如果你在路徑字符串代碼中間使用..
,它將對應于在路徑字符串的那個點上改變一個目錄。例如:
String path = "d:\\data\\projects\\a-project\\..\\another-project";
Path parentDir2 = Paths.get(path);
這個示例創建的Java Path
實例將對應于這個絕對路徑:
d:\data\projects\another-project
a-project
目錄之后的..
代碼,會修改目錄到項目的父目錄中,所以這個目錄是指向another-project
目錄。
.
和..
代碼也可以用于兩個子富川的合并方法Paths.get()
中。下面是兩個簡單演示Java 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
類來處理相對路徑。在本教程中,您將了解到更多相關知識。
Path.normalize()
Path
接口的normalize()
方法可以使路徑標準化。標準化意味著它將移除所有在路徑字符串的中間的.
和..
代碼,并解析路徑字符串所引用的路徑。下面是一個Java 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
實例打印出來(實際上它會打印Path.toString()
)。
然后,該示例在創建的Path
實例上調用normalize()
方法,該實例返回一個新的Path
實例。這個新的、標準化的路徑實例也會被打印出來。
下面是上述示例的輸出:
path1 = d:\data\projects\a-project\..\another-project
path2 = d:\data\projects\another-project
正如您所看到的,標準化的路徑不包含a-project\..
部分,因為這是多余的。移除的部分不會增加最終的絕對路徑。