日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

读取 classpath 资源

發(fā)布時(shí)間:2024/4/11 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 读取 classpath 资源 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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 處理
  • 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 處理
  • 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)題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。