Java中的獲取文件的物理絕對路徑,和讀取文件

獲取文件的絕對路徑,讀取該文件

1、文件目錄打印圖

下面的文件目錄圖,是項目中文件的位置信息;下面的例子是按照這個圖來演示的。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

2、properties文件介紹

如下內容引自Wikipedia: web

.properties 文件是一種和java相關的文件拓展,用於存儲配置信息。每一個參數以一對字符串的信息存儲,即key-value 對。shell

屬性信息的格式: windows

能夠是:key=valuekey = valuekey:valuekey valuetomcat

#! 用於註釋該行(當其在屬性中時,將不起做用),\ 用於轉義和拼接多行的valuebash

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

3、獲取文件路徑

注意: 這裏咱們講的獲取文件路徑和讀取文件,有一個最高級範圍的限定的前提。webapp

在java項目和web項目中,其最高級的目錄只能是並行的java 目錄和resource 目錄。this

所以,咱們只能操做java 中的源代碼文件和resource 的資源文件。對於web項目來講,咱們是沒法經過這裏講的方法來獲取webapp 目錄下的文件的。

咱們想得到的文件路徑,無非是兩種。一是java類文件的路徑(*.java ),二是資源文件的路徑(*.properties或其餘資源文件)。一般狀況下,咱們主要是想獲取資源文件的路徑。

這裏咱們使用DemoTest2.java 類來獲取demo2.propertiesdemo3.properties 這兩個文件的路徑。

說明: 下面所講的方法,其定位參照的方法都是藉助.class 類文件來展開的(也就是第2個目錄結構圖),所以其位置都是編譯後的文件位置(固然,一般其位置和源代碼位置一致)。

咱們所獲取的文件路徑,都是絕對路徑(相對於系統而言的全寫路徑)。好比windows下會是C:/user/ibard/desktop/....,linux下會是/opt/tomcat8/...這樣的物理絕對路徑。

一、URL <- Concrete.class.getResource(String path)方法

在這裏,path能夠是相對路徑,也能夠是絕對路徑(絕對路徑的path以/ 開頭,指向你程序的根目錄)。獲得的結果是URL 類型。

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.二、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對象操做文件。

二、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 對象在後面的資源文件的讀取中就會使用到。

4、讀取資源文件

更多的時候,咱們是要讀取資源文件內部的信息。對於.properties 文件(通常是鍵值對的形式保存信息),在java 中有一個與其對應的類,即Properties 類。經過構造Properties 類,咱們能夠讀取資源的keyvalue

一、 Properties對象讀取資源文件

1.一、生成properties 對象

首先,咱們須要生成Properties 對象:Properties properties= new Properties();

1.二、獲取資源文件的輸入流

而後,咱們須要獲得資源文件的輸入流,而獲得輸入流的方法有兩種。

1.2.一、Concrete.class.getResourceAsStream(String path)

path能夠是相對路徑,也能夠是絕對路徑。

InputStream in = DemoTest2.class.getResourceAsStream("demo2.properties");
1.2.二、Concrete.class.getClassLoader().getResourceAsStream(String path)

path只能是絕對路徑。可是絕對路徑卻不以/ 開頭,和以前相反了

InputStream in = DemoTest2.class.getClassLoader().getResourceAsStream("ibard/demo3/demo3.properties");

1.三、加載輸入流,獲取值

在獲得輸入流以後,將輸入流加載到Properties 對象,以後就能夠獲取值了。

// 加載輸入流對象
properties.load(in);
String value = properties.getProperty("name");
相關文章
相關標籤/搜索