1. 程式人生 > >源碼解讀之File

源碼解讀之File

也不能 ssl 並不是 不能 都是 sem 又是 看到了 normalize

文件和目錄路徑名的抽象表示形式。

我們知道,對於不同的操作系統,文件路徑的描述是不同的

比如 windows平臺:用\ linux平臺:用/ 四個構造方法 API: 文件自身屬性讀取 創建文件/目錄基本操作 文件/目錄 列表讀取
文件權限訪問以及文件信息設置 其他

FileSystem簡介

File中有一個變量fs 類型為FileSystem compareTo方法依賴於他 而equals方法又依賴compareTo hashCode也是依賴他 所以說: compareTo equals hashCode 都依賴於 FileSystem fs 技術分享圖片 其實你在回頭看看整個File文件中,很多個地方都出現了fs的身影

FileSystem到底是什麽?

操作系統有各自的文件系統,這些文件系統又存在很多差異,而Java 因為是跨平臺的,所以它必須要統一處理這些不同平臺文件系統之間的差異,才能往上提供統一的入口。 說白了又是接口來實現統一,不同的操作系統實現這個接口,就可以提供統一的表現形式 FileSystem是一個抽象類 技術分享圖片 windows下的實現類為:WinNTFileSystem,在IDE中可以直接找到 技術分享圖片 可能你只是找到了一個WinNTFileSystem,只有一個要接口還有什麽意思? 如果你目前只看到了一個WinNTFileSystem 那說明你在Windows下 WinNTFileSystem類 和 UnixFileSystem類並不是在同一個 JDK 裏面,也就是說它們是分開的 你只能在 Windows 版本的 JDK 中找到 WinNTFileSystem,而在 Linux 版本的 JDK 中找到 UnixFileSystem 同樣地,其他操作系統也有自己的文件系統實現類。 接下來大致的看下WinNTFileSystem

屬性

技術分享圖片
private final char slash;//斜杠符號
private final char altSlash;//與slash相反的斜杠
private final char semicolon;//分號
private static String[] driveDirCache = new String[26];//表示驅動盤目錄緩存
private ExpiringCache cache = new ExpiringCache();//用於緩存標準路徑
private ExpiringCache prefixCache = new ExpiringCache();//用於緩存標準路徑前綴
技術分享圖片 其實slash就是名稱分隔符 semicolon就是路徑分隔符 構造方法中根據系統變量對文件分隔符和路徑分隔符進行初始化 技術分享圖片
isSlash 和 isLetter都非常簡單,簡單的判斷 技術分享圖片 判斷是否以slash 開頭,是的話直接返回,不是的話,給他加一個 技術分享圖片 getSeparator 和 getPathSeparator 就是File中分隔符的來處 技術分享圖片

路徑的標準化

不光標準化,前面還提到了規範化路徑 File中有方法getCanonicalFile getCanonicalPath 他們到底都是在說什麽事情呢 先說下標準化,看一個例子
我們給出了一個很奇怪的路徑字符串
"D://////\\\\\\/testFile\\\\///////\\wdwqdwqwd.java"

技術分享圖片
技術分享圖片
File file = new File("D://////\\\\\\/testFile\\\\///////\\wdwqdwqwd.java");

if (file.exists()){

System.out.println(file.getName());

}
技術分享圖片

技術分享圖片
雖然看起來很奇怪,但是不影響程序運行 我們此時可以用比較通俗的話來描述這個情況
我們給出來了一個亂七八糟的路徑,最終路徑按照當前文件系統的規則,進行了解析, 去除了不必要的分隔符 或者可能把錯誤的分隔符進行替換等按照一定的規則 整理出來一個合理的路徑,這就是標準化
debug 看下File的構造方法 就知道了 最終他幫我們正確的解析了路徑,這就是標準化 技術分享圖片 可以看得出來,標準化,借助的仍舊是fs 也就是FileSystem 在WinNTFileSystem 中的normalize方法就是標準化路徑的一個對外接口 他還有兩個相關的private方法,用於處理細節 方法的具體過程,到底是怎麽處理的,有興趣的同學可以繼續深挖以下 仔細看下註釋也可理解一二 一個標準的win32路徑名,不能包括重復的名稱分隔符(斜杠) UNC除外 ,也不能以名稱分隔符(斜杠)結束 可能是一個空的String 規範化Win32路徑名具有便捷的特點:前綴的長度幾乎唯一地標識了路徑的類型 無論它是絕對的還是相對的 0,1,2,3是分類說明 技術分享圖片 如同上面標準化描述的一樣,前綴的長度對於標準化很有用,這個方法經常被使用 技術分享圖片 規範化路徑 File中有方法getCanonicalFile getCanonicalPath,規範化,借助的仍舊是fs 也就是FileSystem

源碼解讀之File