Java中的獲取檔案的物理絕對路徑,和讀取檔案

柒葉發表於2019-01-19

獲取檔案的絕對路徑,讀取該檔案

一、檔案目錄列印圖

下面的檔案目錄圖,是專案中檔案的位置資訊;下面的例子是按照這個圖來演示的。

.
|-- 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=valuekey = valuekey:valuekey 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.propertiesdemo3.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 類,我們可以讀取資源的keyvalue

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");

相關文章