下面的文件目錄圖,是項目中文件的位置信息;下面的例子是按照這個圖來演示的。java
. |-- java | |-- ibard | | |-- demo1 | | | `-- DemoTest1.java | | `-- demo2 | | `-- DemoTest2.java `-- resources |-- demo0.properties `-- ibard |-- demo2 | `-- demo2.properties `-- demo3 `-- demo3.properties
項目打包發佈後的目錄結構:(要注意的是,咱們操做的文件狀態是下面這個目錄的情形!)linux
target |-- classes | |-- ibard | | |-- demo0.properties | | |-- demo1 | | | `-- DemoTest1.java | | `-- demo2 | | `-- DemoTest2.java | | | `-- demo2.properties | | |-- demo3 | | `-- demo3.properties
如下內容引自Wikipedia: web
.properties
文件是一種和java相關的文件拓展,用於存儲配置信息。每一個參數以一對字符串的信息存儲,即key-value
對。shell
屬性信息的格式: windows
能夠是:key=value
、key = value
、key:value
、key value
。tomcat
#
或!
用於註釋該行(當其在屬性中時,將不起做用),\
用於轉義和拼接多行的value
。bash
wikipedia的properties文件模板:app
# You are reading the ".properties" entry. ! The exclamation mark can also mark text as comments. # The key characters =, and : should be written with # a preceding backslash to ensure that they are properly loaded. # However, there is no need to precede the value characters =, and : by a backslash. website = https://en.wikipedia.org/ language = English # The backslash below tells the application to continue reading # the value onto the next line. message = Welcome to \ Wikipedia! # Add spaces to the key key\ with\ spaces = This is the value that could be looked up with the key "key with spaces". # Unicode tab : \u0009 # If you want your property to include a backslash, it should be escaped by another backslash path=c:\\wiki\\templates # However, some editors will handle this automatically
注意: 這裏咱們講的獲取文件路徑和讀取文件,有一個最高級範圍的限定的前提。webapp
在java項目和web項目中,其最高級的目錄只能是並行的java
目錄和resource
目錄。this
所以,咱們只能操做java
中的源代碼文件和resource
的資源文件。對於web項目來講,咱們是沒法經過這裏講的方法來獲取webapp
目錄下的文件的。
咱們想得到的文件路徑,無非是兩種。一是java類文件的路徑(*.java
),二是資源文件的路徑(*.properties
或其餘資源文件)。一般狀況下,咱們主要是想獲取資源文件的路徑。
這裏咱們使用DemoTest2.java
類來獲取demo2.properties
和demo3.properties
這兩個文件的路徑。
說明: 下面所講的方法,其定位參照的方法都是藉助.class
類文件來展開的(也就是第2個目錄結構圖),所以其位置都是編譯後的文件位置(固然,一般其位置和源代碼位置一致)。
咱們所獲取的文件路徑,都是絕對路徑(相對於系統而言的全寫路徑)。好比windows下會是C:/user/ibard/desktop/....
,linux下會是/opt/tomcat8/...
這樣的物理絕對路徑。
在這裏,path能夠是相對路徑,也能夠是絕對路徑(絕對路徑的path以/
開頭,指向你程序的根目錄)。獲得的結果是URL
類型。
當使用相對路徑時,其參照目錄是當前類文件所在的目錄。當path傳入的值爲""
時,獲取的就是當前目錄的路徑。
// DemoTest2.java文件的部分代碼 // 1.DemoTest2.java中獲取demo2.properties文件的URL URL url_1 = DemoTest2.class.getResource("demo2.properties"); // 2.生成File對象 File file_1 = new File(url_1.getFile()); // 3.獲取文件的絕對路徑值 String filepath_1 = file_1.toPath();
當使用絕對路徑時,必須是以/
開頭,這表明了當前java源代碼的根目錄。當path傳入的值爲/
時,獲取的就是java源代碼的根目錄。
// DemoTest2.java文件的部分代碼 // 1.DemoTest2.java獲取demo3.properties文件的URL URL url_2 = DemoTest2.class.getResource("/ibard/demo3/demo3.properties"); File file_2 = new File(url_2.getFile()); String filepath_2 = file_2.toPath();
當要獲取的資源文件與當前java類不在同一個包下時,應該使用絕對路徑的方式來獲取資源文件的絕對路徑,進而來生成File對象操做文件。
在這裏,經過獲取類加載器來獲取資源文件的路徑。path只能是絕對路徑,並且該絕對路徑是不以/開頭的。其實介紹的第一種方法,其內部源碼就是調用這種方法。
// DemoTest2.java文件的部分代碼 // 1.DemoTest2.java獲取demo2.properties文件的URL URL url_3 = DemoTest2.class.getClassLoader().getResource("ibard/demo2/demo2.properties"); File file_3 = new File(url_3.getFile()); String filepath_3 = file_3.toPath();
上面介紹的2種方法都是用來獲取文件的File對象和絕對路徑。而File
對象在後面的資源文件的讀取中就會使用到。
更多的時候,咱們是要讀取資源文件內部的信息。對於.properties
文件(通常是鍵值對的形式保存信息),在java
中有一個與其對應的類,即Properties
類。經過構造Properties
類,咱們能夠讀取資源的key
和value
。
properties
對象首先,咱們須要生成Properties
對象:Properties properties= new Properties();
。
而後,咱們須要獲得資源文件的輸入流,而獲得輸入流的方法有兩種。
path能夠是相對路徑,也能夠是絕對路徑。
InputStream in = DemoTest2.class.getResourceAsStream("demo2.properties");
path只能是絕對路徑。可是絕對路徑卻不以/
開頭,和以前相反了。
InputStream in = DemoTest2.class.getClassLoader().getResourceAsStream("ibard/demo3/demo3.properties");
在獲得輸入流以後,將輸入流加載到Properties
對象,以後就能夠獲取值了。
// 加載輸入流對象 properties.load(in); String value = properties.getProperty("name");