读取 classpath 资源
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:" 這種盤符路徑。總不能在開發(fā)的時(shí)候用 windows 路徑,發(fā)布到 Linux 的時(shí)候注釋掉吧?最終,將配置文件放在 java 程序的 resources 下
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è)路徑有兩種寫法:
以"/"開頭,表示以類路徑為起始目錄。不以"/"開頭,表示相對(duì)于當(dāng)前類的相對(duì)路徑。
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?異常,沒有找到這個(gè)文件。
把 getResourceAsStream() 的源碼打開,就會(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ì)判斷路徑的最前面是否有?/,沒有/?就會(huì)加上包名。
總結(jié)
在本文中學(xué)習(xí)了如何讀取 classpath 下的文件,以及看了看獲取文件路徑的源碼,用 getResourc() 方法就可以知道讀取文件的路徑是否正確。
總結(jié)
以上是生活随笔為你收集整理的读取 classpath 资源的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 重学 Java 之 5种字符流读取方法
- 下一篇: 围观了张一鸣近10年的微博,我整理了这2