您好,登錄后才能下訂單哦!
本文小編為大家詳細(xì)介紹“Java如何實(shí)現(xiàn)動(dòng)態(tài)獲取文件的絕對(duì)路徑”,內(nèi)容詳細(xì),步驟清晰,細(xì)節(jié)處理妥當(dāng),希望這篇“Java如何實(shí)現(xiàn)動(dòng)態(tài)獲取文件的絕對(duì)路徑”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來(lái)學(xué)習(xí)新知識(shí)吧。
我們知道在 Java 中讀取一些配置文件信息,是在開(kāi)發(fā)中十分常用的要求。
例如:這里我們使用 JDBC 實(shí)例:連接MySQL 數(shù)據(jù)庫(kù),讀取連接數(shù)據(jù)庫(kù)的 用戶名,密碼 。
如下是一個(gè)名為 jdbc.properties
的配置文件信息,以及存在目錄
package blogs.blogs8; import java.io.FileInputStream; import java.io.IOException; import java.util.Properties; public class IORead { public static void main(String[] args) { FileInputStream f = null; try { // 創(chuàng)建字節(jié)輸入流對(duì)象 // 在IDEA 中的默認(rèn)相對(duì)路徑是在 src 同級(jí)目錄下的 f = new FileInputStream("src/blogs/blogs8/jdbc.properties"); // 創(chuàng)建Map集合中的 Properties 對(duì)象 Properties properties = new Properties(); properties.load(f); // 通過(guò) key 讀取對(duì)應(yīng)的鍵值對(duì) String user = properties.getProperty("user"); System.out.println(user); String password = properties.getProperty("password"); System.out.println(password); } catch (IOException e) { e.printStackTrace(); } finally { // 關(guān)閉IO資源 if(f == null) { try { f.close(); } catch (IOException e) { e.printStackTrace(); } } } } }
說(shuō)明:
上述的讀取文件的方式,我們可以看到是 “完全沒(méi)有問(wèn)題的” 可以讀取到對(duì)應(yīng)的配置信息,但是存在一個(gè)缺點(diǎn):就是移除性差。src 中是在 IDEA 這個(gè)編譯器中體現(xiàn)的,如果是在其它的編譯器中運(yùn)行的時(shí)候,很大的可能會(huì)報(bào)錯(cuò),原因是:這里我們使用的相對(duì)路徑是,在 IDEA中的,IDEA 中的默認(rèn)相對(duì)路徑是 在 project 下的也就是 src 的同級(jí)目錄。但是其它的系統(tǒng),或者編譯器就可能不是這個(gè)和 IDEA 中默認(rèn)相對(duì)路徑了。運(yùn)行程序時(shí),就有可能會(huì)報(bào)錯(cuò):如下:找不到指定的文件。
上述這種方式:如果我們不寫(xiě)相對(duì)路徑,而是寫(xiě)絕對(duì)路徑的話,也是存在一個(gè)問(wèn)題的。那就是因?yàn)樵摻^對(duì)路徑是寫(xiě)死了的,不是動(dòng)態(tài)獲取的,該路徑在 Windows 操作系統(tǒng)中是存在盤(pán)符的,所以寫(xiě)絕對(duì)路徑的時(shí)候是需要帶上盤(pán)符(E盤(pán),D盤(pán)的),但是如果該程序是運(yùn)行在其他操作系統(tǒng)中的話,比如 Linux 操作系統(tǒng)中是沒(méi)有盤(pán)符的說(shuō)法的。所以就會(huì)出問(wèn)題。無(wú)法跨平臺(tái)。
接下來(lái)說(shuō)一種比較通用的一種路徑:即使代碼換位置了,這樣的代碼編寫(xiě)的方式仍然是通用的。因?yàn)樵撐募穆窂绞莿?dòng)態(tài)獲取的。
在Windows中的話,就以該系統(tǒng)的文件規(guī)則,動(dòng)態(tài)獲取到的絕對(duì)路徑是帶盤(pán)符的,而 Linux系統(tǒng)中就以該系統(tǒng)的文件規(guī)則,獲取到的絕對(duì)路徑是不帶盤(pán)符的。 這就可以跨平臺(tái)了。
注意: 使用該方式的前提是:所讀取的文件必須是在 類(lèi)路徑
下才行。如果不是在類(lèi)路徑下,運(yùn)行程序時(shí)是會(huì)報(bào)錯(cuò):系統(tǒng)找不到指定的路徑
。
什么是類(lèi)路徑 ?
類(lèi)路徑也是一種特殊的相對(duì)路徑,只不過(guò)它相對(duì)的是class文件。在 IDEA 中的類(lèi)路徑是在 src 目錄下的。重點(diǎn)記住它
該方式的核心代碼:
String path = Thread.currentThread().getContextClassLoader().getResource("db.properties").getPath(); /* 解釋: Thread.currentThread() 當(dāng)前線程對(duì)象 getContextClassLoader() 是線程對(duì)象的方法,可以獲取到當(dāng)前線程的類(lèi)加載對(duì)象 getResource() 獲取資源:這是類(lèi)加載器對(duì)象的方法,當(dāng)前線程的類(lèi)加載器默認(rèn)從類(lèi)的根路徑下加載資源。 getPath() 獲取當(dāng)文件的絕對(duì)路徑 */
所讀取的文件是直接存放在 src 的目錄下的,該文件的并沒(méi)有其它的的包。如下圖所示:可以直接寫(xiě)文件名 + 文件名的后綴即可。
import java.io.FileInputStream; import java.io.IOException; import java.util.Properties; public class IORead { public static void main(String[] args) { String path = Thread.currentThread().getContextClassLoader().getResource("db.properties").getPath(); System.out.println(path); // 返回該文件的絕對(duì)路徑: } }
通過(guò)該方式獲取到指定文件的絕對(duì)路徑,再將該絕對(duì)路徑,作為參數(shù),創(chuàng)建FileInputStream
字節(jié)輸入流對(duì)象
import java.io.FileInputStream; import java.io.IOException; import java.util.Properties; public class IORead { public static void main(String[] args) { FileInputStream f = null; try { // 獲取到該配置文件的的絕對(duì)路徑 String path = Thread.currentThread().getContextClassLoader().getResource("db.properties").getPath(); // 通過(guò)該獲取的文件的絕對(duì)路徑創(chuàng)建 字節(jié)輸入流對(duì)象 f = new FileInputStream(path); // 創(chuàng)建Map集合中的 Properties 對(duì)象 Properties properties = new Properties(); properties.load(f); // 通過(guò) key 讀取對(duì)應(yīng)的鍵值對(duì) String user = properties.getProperty("user"); System.out.println(user); String password = properties.getProperty("password"); System.out.println(password); } catch (IOException e) { e.printStackTrace(); } finally { // 關(guān)閉IO資源 if (f != null) { try { f.close(); } catch (IOException e) { e.printStackTrace(); } } } } }
也是可以讀取到文件中是在 src 目錄下。
當(dāng)所讀取的文件,是在 src 目錄下,但是該 src 目錄下還有其他的包(目錄),則不可以直接寫(xiě) “文件名+ 文件后綴名”了,而是需要寫(xiě)明該 src 包(目錄)下的 相對(duì)路徑:如下圖所示的文件:該路徑名應(yīng)該是:blogs/blogs8/jdbc.properties
舉例:
import java.io.FileInputStream; import java.io.IOException; import java.util.Properties; public class IORead { public static void main(String[] args) { FileInputStream f = null; try { // 獲取到該配置文件的的絕對(duì)路徑,如下src目錄下還有目錄(包),需要指定 src目錄下/包下的哪個(gè)文件。 String path = Thread.currentThread().getContextClassLoader().getResource("blogs/blogs8/jdbc.properties").getPath(); // 通過(guò)該獲取的文件的絕對(duì)路徑創(chuàng)建 字節(jié)輸入流對(duì)象 f = new FileInputStream(path); // 創(chuàng)建Map集合中的 Properties 對(duì)象 Properties properties = new Properties(); properties.load(f); // 通過(guò) key 讀取對(duì)應(yīng)的鍵值對(duì) String user = properties.getProperty("user"); System.out.println(user); String password = properties.getProperty("password"); System.out.println(password); } catch (IOException e) { e.printStackTrace(); } finally { // 關(guān)閉IO資源 if (f != null) { try { f.close(); } catch (IOException e) { e.printStackTrace(); } } } }
上述方式一:我們需要通過(guò) :new 一個(gè) FileInputStream 字節(jié)輸入流對(duì)象的方式,這里我們直接通過(guò)指定的文件名的,直接返回一個(gè) InputStream 字節(jié)輸入流 ,不需要 new 。
同樣的:該讀取的文件必須是在類(lèi)路徑下才行,這里的IDEA的類(lèi)路徑是 src 目錄下
核心代碼如下:
// 直接以流的形式返回。 InputStream resourceAsStream = Thread.currentThread().getContextClassLoader(). getResourceAsStream("db.properties");
舉例:
import java.io.IOException; import java.io.InputStream; import java.util.Properties; public class IORead { public static void main(String[] args) { // 直接在 src目錄下沒(méi)有包含任何子目錄,可以直接寫(xiě)文件名+ 后綴,而如果有子目錄,需要指明子目錄下的文件名+后綴名 InputStream inputStream = Thread.currentThread().getContextClassLoader().getResourceAsStream("db.properties"); // 創(chuàng)建 Properties 集合對(duì)象,通過(guò)流獲取指定配置文件中的鍵值對(duì)信息 Properties properties = new Properties(); try { properties.load(inputStream); } catch (IOException e) { e.printStackTrace(); } String user = properties.getProperty("user"); System.out.println(user); String password = properties.getProperty("password"); System.out.println(password); // 關(guān)閉IO資源 if (inputStream != null) { try { inputStream.close(); } catch (IOException e) { e.printStackTrace(); } } } }
上述兩個(gè)方式可以獲取到任意文件的信息。
但是以下這個(gè)方式三:就只能獲取到 類(lèi)路徑下的以 .properties
后綴的配置文件信息了。
java.util
包下提供了一個(gè)資源綁定器,便于獲取屬性.properties
配置文件中的內(nèi)容。
該資源綁定器:只能綁定 xxx.properties
配置文件 ,并且這個(gè)文件必須在 類(lèi)路徑下,這里的 IDEA 是 src 目錄下。
并且在寫(xiě)路徑的時(shí)候,路徑后面的擴(kuò)展名不能寫(xiě),寫(xiě)了會(huì)報(bào)錯(cuò): ``。因?yàn)榧热恢荒茏x取 properteis 后綴的文件,那就不用再多余的寫(xiě)文件后綴名了。
如果在 src 目錄下的子目錄中的文件,需要指明是 src 下的哪個(gè)子目錄下的文件,同樣不要寫(xiě)文件后綴名,不然報(bào)錯(cuò)。
舉例:
import java.util.ResourceBundle; public class IORead { public static void main(String[] args) { ResourceBundle resourceBundle = ResourceBundle.getBundle("db"); String user = resourceBundle.getString("user"); System.out.println(user); String password = resourceBundle.getString("password"); System.out.println(password); } }
讀到這里,這篇“Java如何實(shí)現(xiàn)動(dòng)態(tài)獲取文件的絕對(duì)路徑”文章已經(jīng)介紹完畢,想要掌握這篇文章的知識(shí)點(diǎn)還需要大家自己動(dòng)手實(shí)踐使用過(guò)才能領(lǐng)會(huì),如果想了解更多相關(guān)內(nèi)容的文章,歡迎關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。