Java 程序經常要讀取配置文件(properties)、圖片(jpg)、文本文件(txt、csv),我們可以使用 上次所講的 InputStream 實現。
public static void main(String[] args) throws Exception {
String path = "D:config.properties";
byte[] config = new byte[1024];
try (InputStream inputStream = new FileInputStream(path)){
while (inputStream.read(config) != -1) {
System.out.println(new String(config, "utf-8"));
}
}
}
讀取classpath
java 程序經常是部署在 Linux 上的,必然不可能使用 "D:" 這種盤符路徑??偛荒茉陂_發的時候用 windows 路徑,發布到 Linux 的時候注釋掉吧?最終,將配置文件放在 java 程序的 resources 下
- 使用 class 處理
class 的 getResourceAsStream() 方法可以返回一個 InputStream。
public void readProperties() {
InputStream inputStream = this.getClass().getResourceAsStream("/config.properties");
this.parseInputStream(inputStream);
}
public void parseInputStream(InputStream inputStream) {
try {
byte[] config = new byte[1024];
while (inputStream.read(config) != -1) {
System.out.println(new String(config, "utf-8"));
}
} catch (Exception e) {
e.printStackTrace();
}
}
該方法接受一個文件路徑字符串參數,表示文件的路徑,這個路徑有兩種寫法:
以"/"開頭,表示以類路徑為起始目錄。不以"/"開頭,表示相對于當前類的相對路徑。
- 使用 ClassLoader 處理
ClassLoader 下也是 getResourceAsStream() 方法,這個方法的參數不能加 /
,不然就是找不到文件。
public void readProperties() {
InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream("config.properties");
this.parseInputStream(inputStream);
}
getResourceAsStream 源碼分析
把 class.getResourceAsStream() 方法上路徑參數中的 /
拿掉,就會報 java.lang.NullPointerException
異常,沒有找到這個文件。
把 getResourceAsStream() 的源碼打開,就會發現讀取資源文件路徑的源碼中調用的居然是 ClassLoader 的 getResource() 方法。
public URL getResource(String name) {
URL url;
if (parent != null) {
url = parent.getResource(name);
} else {
url = getBootstrapResource(name);
}
if (url == null) {
url = findResource(name);
}
return url;
}
也就是說 class 和 classLoader 讀取文件實際上調用的是同一個方法。不過在 class.getResourceAsStream() 調用 getResource 之前會判斷路徑的最前面是否有 /
,沒有 /
就會加上包名。
總結
在本文中學習了如何讀取 classpath 下的文件,以及看了看獲取文件路徑的源碼,用 getResourc() 方法就可以知道讀取文件的路徑是否正確。
-
Linux
+關注
關注
87文章
11296瀏覽量
209353 -
JAVA
+關注
關注
19文章
2966瀏覽量
104704 -
程序
+關注
關注
117文章
3785瀏覽量
81006
發布評論請先 登錄
相關推薦
評論