Java?IO?API實現(xiàn)獲取路徑信息并去除冗余信息
Java IO API - 獲取路徑信息
Path 可以被看作是存儲路徑名稱元素的序列。路徑結構中的第一個元素位于索引 0,而最后一個元素位于索引 [n-1],其中 n 是路徑中元素的數(shù)量。Java 提供了多種方法來根據(jù)這些索引獲取單獨的元素或路徑的子序列。
示例目錄結構
我們使用以下目錄結構作為示例:
- Windows:
C:\home\joe\foo - Solaris:
/home/joe/foo
基本路徑操作示例
下面的代碼示例定義了一個 Path 實例,并調(diào)用了多個方法來獲取路徑的信息:
import java.nio.file.Path;
import java.nio.file.Paths;
public class PathInfoExample {
public static void main(String[] args) {
// 創(chuàng)建一個路徑實例,Windows 路徑格式
Path pathWindows = Paths.get("C:\\home\\joe\\foo");
// 創(chuàng)建一個路徑實例,Solaris 路徑格式
Path pathSolaris = Paths.get("/home/joe/foo");
// 打印路徑的各種信息
printPathInfo(pathWindows);
printPathInfo(pathSolaris);
}
public static void printPathInfo(Path path) {
System.out.format("toString: %s%n", path.toString());
System.out.format("getFileName: %s%n", path.getFileName());
System.out.format("getName(0): %s%n", path.getName(0));
System.out.format("getNameCount: %d%n", path.getNameCount());
System.out.format("subpath(0,2): %s%n", path.subpath(0, 2));
System.out.format("getParent: %s%n", path.getParent());
System.out.format("getRoot: %s%n", path.getRoot());
}
}
方法與輸出說明
以下是 Path 對象方法的詳細解釋和在不同操作系統(tǒng)下的返回值:
| 方法 | Solaris 返回值 | Windows 返回值 | 說明 |
|---|---|---|---|
| toString() | /home/joe/foo | C:\home\joe\foo | 返回路徑的字符串表示。對于 UNIX 操作系統(tǒng),會修正路徑格式(例如 //home/joe/foo 會變?yōu)?/home/joe/foo)。 |
| getFileName() | foo | foo | 返回路徑的文件名(或路徑中的最后一個元素)。 |
| getName(0) | home | home | 返回路徑中指定索引位置的元素。此處為路徑的第一個目錄元素。 |
| getNameCount() | 3 | 3 | 返回路徑中元素的數(shù)量。 |
| subpath(0, 2) | home/joe | home\joe | 返回路徑的子序列(不包含根元素),從索引 0 到索引 2(不包括索引 2)。 |
| getParent() | /home/joe | \home\joe | 返回路徑的父級目錄。 |
| getRoot() | / | C:\ | 返回路徑的根目錄。 |
相對路徑示例
下面是使用相對路徑時的代碼示例:
// Solaris 路徑格式
Path pathSolarisRelative = Paths.get("sally/bar");
// Windows 路徑格式
Path pathWindowsRelative = Paths.get("sally\\bar");
printPathInfo(pathSolarisRelative);
printPathInfo(pathWindowsRelative);
在 Solaris 和 Windows 中,輸出結果如下:
| 方法 | Solaris 返回值 | Windows 返回值 |
|---|---|---|
| toString() | sally/bar | sally\bar |
| getFileName() | bar | bar |
| getName(0) | sally | sally |
| getNameCount() | 2 | 2 |
| subpath(0, 1) | sally | sally |
| getParent() | sally | sally |
| getRoot() | null | null |
解釋
- toString(): 返回路徑的字符串表示。當路徑包含相對目錄時,toString() 將顯示相對路徑,如 sally/bar 或 sally\bar。
- getFileName(): 返回路徑的最后一個部分(文件名或目錄名),在上述示例中是 bar。
- getName(0): 返回路徑的第一個部分,這里是 sally。
- getNameCount(): 返回路徑中元素的數(shù)量,顯示路徑中有多少級目錄或文件名。
- subpath(0, 1): 返回從索引 0 到索引 1 之間的路徑子序列。
- getParent(): 返回路徑的父級目錄,對于相對路徑,返回的是直接上級目錄。
- getRoot(): 對于相對路徑,返回 null,因為相對路徑?jīng)]有根目錄;對于絕對路徑,返回根目錄(如 / 或 C:\)。
Java IO API -去除路徑中的冗余信息
在文件系統(tǒng)中,有一些特殊的路徑標記:
"."表示當前目錄(current directory)".."表示父目錄(parent directory)
問題背景
你可能會遇到這樣的路徑:
/home/./joe/foo
/home/sally/../joe/foo
這些路徑雖然可以正常使用,但存在冗余部分:
./實際上什么都沒改變sally/..實際上回到了sally的上一級目錄,也就是去掉了sally
我們希望清理這些冗余路徑,使其更簡潔、語義清晰。為此,Java 提供了 normalize() 方法。
normalize() 方法:清理路徑語法
normalize() 方法會純粹基于字符串結構來移除路徑中的冗余部分,例如:
"./"會被移除"xxx/.."會被刪除(包括xxx和..)
注意:這個過程不會訪問實際文件系統(tǒng)!它只是語法層面的路徑清理。
示例代碼:
import java.nio.file.Path;
import java.nio.file.Paths;
public class PathNormalizationExample {
public static void main(String[] args) {
Path path1 = Paths.get("/home/./joe/foo");
Path path2 = Paths.get("/home/sally/../joe/foo");
System.out.println("Original path1: " + path1);
System.out.println("Normalized path1: " + path1.normalize());
System.out.println("Original path2: " + path2);
System.out.println("Normalized path2: " + path2.normalize());
}
}
輸出結果:
Original path1: /home/./joe/foo
Normalized path1: /home/joe/foo
Original path2: /home/sally/../joe/foo
Normalized path2: /home/joe/foo
注意事項:normalize() 是“語法清理”,不是“路徑驗證”
雖然 normalize() 非常有用,但它**不會考慮符號鏈接(symbolic links)**或文件系統(tǒng)中的真實結構。
比如:/home/sally -> /mnt/data/logs
如果你有路徑 /home/sally/../joe/foo,直接 normalize() 會變成 /home/joe/foo。但這時候,sally 實際是個鏈接,刪掉它可能指向了錯誤的路徑!
更安全的方式:toRealPath()
如果希望在清理路徑的同時確認文件或目錄真實存在且正確解析符號鏈接,請使用 toRealPath() 方法。
Path path = Paths.get("/home/sally/../joe/foo");
Path realPath = path.toRealPath(); // 會解析鏈接,并檢查文件存在性
- 如果路徑不存在或無法解析,會拋出異常
- 會返回標準化、絕對的、符號鏈接已解析的路徑
小結
| 方法 | 功能說明 | 是否訪問文件系統(tǒng) |
|---|---|---|
| normalize() | 清除路徑中的 "." 和 "../",只做語法層面簡化 | ? 否 |
| toRealPath() | 返回真實存在的路徑,解析符號鏈接并驗證實際文件結構 | ? 是 |
總結
通過 Path 類提供的各種方法,您可以輕松獲取路徑的各個部分,包括文件名、父目錄、根目錄以及路徑元素的子序列。這些方法在處理路徑時非常有用,尤其是在需要處理跨平臺文件路徑的場景下。
到此這篇關于Java IO API實現(xiàn)獲取路徑信息并去除冗余信息的文章就介紹到這了,更多相關Java獲取路徑信息內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
SpringBoot切面實現(xiàn)token權限校驗詳解
這篇文章主要介紹了SpringBoot切面實現(xiàn)token權限校驗詳解,要實現(xiàn)權限校驗,首先數(shù)據(jù)表和實體類上需要有權限字段,我的表中permission和gender是通過外鍵約束permission表和gender表實現(xiàn)枚舉的,因為可拓展性更好,需要的朋友可以參考下2024-01-01
springboot對接第三方微信授權及獲取用戶的頭像和昵稱等等
這篇文章主要介紹了springboot對接第三方微信授權及獲取用戶的頭像和昵稱等等,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-01-01
spring中@SpringBootTest注解的實現(xiàn)
SpringBootTest是SpringBoot集成測試核心注解,通過加載完整應用上下文和配置,文中通過示例代碼介紹的非常詳細,需要的朋友們下面隨著小編來一起學習學習吧2025-07-07
利用Kotlin + Spring Boot實現(xiàn)后端開發(fā)
這篇文章主要給大家介紹了關于利用Kotlin + Spring Boot實現(xiàn)后端開發(fā)的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2018-11-11

