源碼解讀之File
阿新 • • 發佈:2019-01-09
也不能 ssl 並不是 不能 都是 sem 又是 看到了 normalize
文件權限訪問以及文件信息設置 其他FileSystem到底是什麽?
操作系統有各自的文件系統,這些文件系統又存在很多差異,而Java 因為是跨平臺的,所以它必須要統一處理這些不同平臺文件系統之間的差異,才能往上提供統一的入口。
說白了又是接口來實現統一,不同的操作系統實現這個接口,就可以提供統一的表現形式
FileSystem是一個抽象類
windows下的實現類為:WinNTFileSystem,在IDE中可以直接找到
可能你只是找到了一個WinNTFileSystem,只有一個要接口還有什麽意思?
如果你目前只看到了一個WinNTFileSystem 那說明你在Windows下
WinNTFileSystem類 和 UnixFileSystem類並不是在同一個 JDK 裏面,也就是說它們是分開的
你只能在 Windows 版本的 JDK 中找到 WinNTFileSystem,而在 Linux 版本的 JDK 中找到 UnixFileSystem
同樣地,其他操作系統也有自己的文件系統實現類。
接下來大致的看下WinNTFileSystem
isSlash 和 isLetter都非常簡單,簡單的判斷
判斷是否以slash 開頭,是的話直接返回,不是的話,給他加一個
getSeparator 和 getPathSeparator 就是File中分隔符的來處
雖然看起來很奇怪,但是不影響程序運行
我們此時可以用比較通俗的話來描述這個情況
debug 看下File的構造方法 就知道了
最終他幫我們正確的解析了路徑,這就是標準化
可以看得出來,標準化,借助的仍舊是fs 也就是FileSystem
在WinNTFileSystem 中的normalize方法就是標準化路徑的一個對外接口
他還有兩個相關的private方法,用於處理細節
方法的具體過程,到底是怎麽處理的,有興趣的同學可以繼續深挖以下
仔細看下註釋也可理解一二
一個標準的win32路徑名,不能包括重復的名稱分隔符(斜杠) UNC除外 ,也不能以名稱分隔符(斜杠)結束
可能是一個空的String
規範化Win32路徑名具有便捷的特點:前綴的長度幾乎唯一地標識了路徑的類型
無論它是絕對的還是相對的
0,1,2,3是分類說明
如同上面標準化描述的一樣,前綴的長度對於標準化很有用,這個方法經常被使用
規範化路徑 File中有方法getCanonicalFile getCanonicalPath,規範化,借助的仍舊是fs 也就是FileSystem
文件和目錄路徑名的抽象表示形式。
我們知道,對於不同的操作系統,文件路徑的描述是不同的
比如 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就是路徑分隔符 構造方法中根據系統變量對文件分隔符和路徑分隔符進行初始化
路徑的標準化
不光標準化,前面還提到了規範化路徑 File中有方法getCanonicalFile getCanonicalPath 他們到底都是在說什麽事情呢 先說下標準化,看一個例子我們給出了一個很奇怪的路徑字符串 "D://////\\\\\\/testFile\\\\///////\\wdwqdwqwd.java" File file = new File("D://////\\\\\\/testFile\\\\///////\\wdwqdwqwd.java"); if (file.exists()){ System.out.println(file.getName()); }
|
我們給出來了一個亂七八糟的路徑,最終路徑按照當前文件系統的規則,進行了解析, 去除了不必要的分隔符 或者可能把錯誤的分隔符進行替換等按照一定的規則 整理出來一個合理的路徑,這就是標準化 |
源碼解讀之File