String workDirectory = System.getProperty("user.dir");
很多同學(xué)一定寫過或者見過上面的代碼沾谓。那么大家有沒有思考過,"user.dir"到底是什么意思上遥?是系統(tǒng)環(huán)境變量搏屑?還是用戶文件夾?
正所謂“萬事不決問源碼”粉楚,讓我們一起到源代碼里一探究竟:
public static String getProperty(String key) {
checkKey(key);
SecurityManager sm = getSecurityManager();
if (sm != null) {
sm.checkPropertyAccess(key);
}
return props.getProperty(key);
}
// 本地方法辣恋,用于初始化props屬性
private static native Properties initProperties(Properties props);
從上面源碼中我們可以看出,getProperty方法是從System類的一個靜態(tài)屬性props里面獲取相應(yīng)的值模软,而props屬性是通過本地方法initProperties來賦予初值的伟骨。也就是說,在JVM啟動時通過執(zhí)行本地方法自動初始化了這個系統(tǒng)屬性燃异。好在jdk的文檔注釋上向我們說明了JVM確保有哪些屬性携狭,我們通過下表列出:
屬性名 | 說明 | 示例值 |
---|---|---|
java.version | Java版本號 | 11.0.5 |
java.version.date | Java版本日期 | 2019-10-15 |
java.vendor | Java供應(yīng)商指定字符串 | Oracle Corporation |
java.vendor.url | Java供應(yīng)商URL | http://java.oracle.com/ |
java.vendor.version | Java供應(yīng)商版本 | 18.9 |
java.home | Java安裝根目錄 | /usr/lib/jvm/jdk-11.0.5 |
java.class.version | Java 類文件版本號 | 55.0 |
java.class.path | Java 類路徑 | 太長,這里省略 |
os.name | 操作系統(tǒng)名 | Linux |
os.arch | 操作系統(tǒng)架構(gòu) | amd64 |
os.version | 操作系統(tǒng)版本 | 5.0.0-37-generic |
file.separator | 文件分隔符 | / |
path.separator | 路徑分隔符 | : |
line.separator | 換行符 | \n |
user.name | 用戶賬號 | lhing17 |
user.home | 用戶根目錄 | /home/lhing17 |
user.dir | 用戶當(dāng)前工作目錄 | /home/lhing17/IdeaProjects/rocketDownloader |
上表中的示例值是在我個人電腦上通過測試類輸出的結(jié)果回俐。我們可以清楚地看到逛腿,"user.dir"是指用戶當(dāng)前工作目錄。如果你是在IDE中運(yùn)行項目仅颇,這個目錄就是你當(dāng)前項目所在的根目錄单默。除了"user.dir"外,這里還提供了其他一些有用的屬性忘瓦,比如"java.home"搁廓、"user.home"等。JVM(指java虛擬機(jī))保證上表中的屬性是有值的耕皮,在項目中我們可以放心通過System.getProperty(propertyName)的方式去獲取境蜕,不必?fù)?dān)心發(fā)生空指針異常。
我們還可以通過System.setProperty(propertyName, propertyValue)的方式去修改這些屬性凌停,或者自定義一些新的屬性粱年。但是,java官方文檔中明確提醒我們罚拟,修改這些系統(tǒng)屬性可能造成不可預(yù)料的副作用台诗,通常情況下我們不應(yīng)該去修改這些屬性。
總結(jié)
System.getProperty方法獲取的屬性是由JVM加載時初始化的屬性舟舒,如"user.dir"代表用戶當(dāng)前的工作目錄拉庶。JVM確保一些指定的屬性值存在嗜憔,我們可以放心調(diào)用秃励。