獲取檔案的絕對路徑,讀取該檔案
一、檔案目錄列印圖
下面的檔案目錄圖,是專案中檔案的位置資訊;下面的例子是按照這個圖來演示的。
.
|-- java
| |-- ibard
| | |-- demo1
| | | `-- DemoTest1.java
| | `-- demo2
| | `-- DemoTest2.java
`-- resources
|-- demo0.properties
`-- ibard
|-- demo2
| `-- demo2.properties
`-- demo3
`-- demo3.properties
專案打包釋出後的目錄結構:(要注意的是,我們操作的檔案狀態是下面這個目錄的情形!)
target
|-- classes
| |-- ibard
| | |-- demo0.properties
| | |-- demo1
| | | `-- DemoTest1.java
| | `-- demo2
| | `-- DemoTest2.java
| | | `-- demo2.properties
| | |-- demo3
| | `-- demo3.properties
二、properties檔案介紹
以下內容引自Wikipedia:
.properties
檔案是一種和java相關的檔案擴充,用於儲存配置資訊。每個引數以一對字串的資訊儲存,即key-value
對。
屬性資訊的格式:
可以是:key=value
、key = value
、key:value
、key value
。
#
或!
用於註釋該行(當其在屬性中時,將不起作用), 用於轉義和拼接多行的
value
。
wikipedia的properties檔案模板:
# 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
三、獲取檔案路徑
注意: 這裡我們講的獲取檔案路徑和讀取檔案,有一個最高階範圍的限定的前提。
在java專案和web專案中,其最高階的目錄只能是並行的java
目錄和resource
目錄。
因此,我們只能操作java
中的原始碼檔案和resource
的資原始檔。對於web專案來說,我們是無法通過這裡講的方法來獲取webapp
目錄下的檔案的。
我們想獲得的檔案路徑,無非是兩種。一是java類檔案的路徑(*.java
),二是資原始檔的路徑(*.properties
或其他資原始檔)。通常情況下,我們主要是想獲取資原始檔的路徑。
這裡我們使用DemoTest2.java
類來獲取demo2.properties
和demo3.properties
這兩個檔案的路徑。
說明: 下面所講的方法,其定位參照的方法都是藉助.class
類檔案來展開的(也就是第2個目錄結構圖),因此其位置都是編譯後的檔案位置(當然,通常其位置和原始碼位置一致)。
我們所獲取的檔案路徑,都是絕對路徑(相對於系統而言的全寫路徑)。比如windows下會是C:/user/ibard/desktop/....
,linux下會是/opt/tomcat8/...
這樣的物理絕對路徑。
1、URL <- Concrete.class.getResource(String path)方法
在這裡,path可以是相對路徑,也可以是絕對路徑(絕對路徑的path以/
開頭,指向你程式的根目錄)。得到的結果是URL
型別。
1.1、path使用相對路徑
當使用相對路徑時,其參照目錄是當前類檔案所在的目錄。當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();
1.2、path使用絕對路徑
當使用絕對路徑時,必須是以/
開頭,這代表了當前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物件操作檔案。
2、URL <- Concrete.class.getClassLoader().getResource(String path)方法
在這裡,通過獲取類載入器來獲取資原始檔的路徑。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
。
1、 Properties物件讀取資原始檔
1.1、生成properties
物件
首先,我們需要生成Properties
物件:Properties properties= new Properties();
。
1.2、獲取資原始檔的輸入流
然後,我們需要得到資原始檔的輸入流,而得到輸入流的方法有兩種。
1.2.1、Concrete.class.getResourceAsStream(String path)
path可以是相對路徑,也可以是絕對路徑。
InputStream in = DemoTest2.class.getResourceAsStream("demo2.properties");
1.2.2、Concrete.class.getClassLoader().getResourceAsStream(String path)
path只能是絕對路徑。但是絕對路徑卻不以/
開頭,和之前相反了。
InputStream in = DemoTest2.class.getClassLoader().getResourceAsStream("ibard/demo3/demo3.properties");
1.3、載入輸入流,獲取值
在得到輸入流之後,將輸入流載入到Properties
物件,之後就可以獲取值了。
// 載入輸入流物件
properties.load(in);
String value = properties.getProperty("name");