Java 程序經(jīng)常要讀取配置文件(properties)、圖片(jpg)、文本文件(txt、csv),我們可以使用 上次所講的 InputStream 實(shí)現(xiàn)。
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 程序經(jīng)常是部署在 Linux 上的,必然不可能使用 "D:" 這種盤(pán)符路徑??偛荒茉陂_(kāi)發(fā)的時(shí)候用 windows 路徑,發(fā)布到 Linux 的時(shí)候注釋掉吧?最終,將配置文件放在 java 程序的 resources 下

- 使用 class 處理
class 的 getResourceAsStream() 方法可以返回一個(gè) 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();
}
}
該方法接受一個(gè)文件路徑字符串參數(shù),表示文件的路徑,這個(gè)路徑有兩種寫(xiě)法:
以"/"開(kāi)頭,表示以類路徑為起始目錄。不以"/"開(kāi)頭,表示相對(duì)于當(dāng)前類的相對(duì)路徑。
- 使用 ClassLoader 處理
ClassLoader 下也是 getResourceAsStream() 方法,這個(gè)方法的參數(shù)不能加 /,不然就是找不到文件。
public void readProperties() {
InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream("config.properties");
this.parseInputStream(inputStream);
}
getResourceAsStream 源碼分析
把 class.getResourceAsStream() 方法上路徑參數(shù)中的 / 拿掉,就會(huì)報(bào) java.lang.NullPointerException 異常,沒(méi)有找到這個(gè)文件。
把 getResourceAsStream() 的源碼打開(kāi),就會(huì)發(fā)現(xiàn)讀取資源文件路徑的源碼中調(diào)用的居然是 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;
}
也就是說(shuō) class 和 classLoader 讀取文件實(shí)際上調(diào)用的是同一個(gè)方法。不過(guò)在 class.getResourceAsStream() 調(diào)用 getResource 之前會(huì)判斷路徑的最前面是否有 /,沒(méi)有 / 就會(huì)加上包名。

總結(jié)
在本文中學(xué)習(xí)了如何讀取 classpath 下的文件,以及看了看獲取文件路徑的源碼,用 getResourc() 方法就可以知道讀取文件的路徑是否正確。
-
Linux
+關(guān)注
關(guān)注
88文章
11763瀏覽量
219079 -
JAVA
+關(guān)注
關(guān)注
20文章
3001瀏覽量
116455 -
程序
+關(guān)注
關(guān)注
117文章
3846瀏覽量
85256
發(fā)布評(píng)論請(qǐng)先 登錄
C語(yǔ)言入門(mén)教程-讀取文本文件
如何通過(guò)pandas讀取csv文件指定的前幾行?
LabVIEW讀取兩列txt文件的工程文件免費(fèi)下載
介紹Python中常用的文件讀取方法以及應(yīng)用示例
PSTViewer軟件如何操作以讀取帶有附件的PST文件
如何讀取 classpath 下的文件
評(píng)論