java中Class.getResource用法(用於配置檔案的讀取)
用JAVA獲取檔案,聽似簡單,但對於很多像我這樣的新人來說,還是掌握頗淺,用起來感覺頗深,大常最經常用的,就是用JAVA的File類,如要取得c:/test.txt檔案,就會這樣用File file = new File("c:/test.txt");這樣用有什麼問題,相信大家都知道,就是路徑硬編碼,對於JAVA精神來說,應用應該一次成型,到處可用,並且從現實應用來講,最終生成的應用也會部署到Windows外的作業系統中,對於linux來說,在應用中用了c:/這樣的字樣,就是失敗,所以,我們應該儘量避免使用硬編碼,即直接使用絕對路徑。
在Servlet應用中,有一個getRealPath(String str)的方法,這個方法儘管也可以動態地獲得檔案的路徑,不祕直接手寫絕對路徑,但這也是一個不被建議使用的方法,那麼,我們有什麼方法可以更好地獲得檔案呢?
那就是Class.getResource()與Class.getResourceAsStream()方法,但很多人還是不太懂它的用法,因為很多人(比如不久前的我)都不知道應該傳怎麼樣的引數給它,當然,有些人己經用得如火純青,這些人是不需要照顧的,在此僅給不會或者還不是很熟的人解釋一點點。
比如我們有以下目錄
|--project
|--src
|--javaapplication
|--Test.java
|--file1.txt
|--file2.txt
|--build
|--javaapplication
|--Test.class
|--file3.txt
|--file4.txt
在上面的目錄中,有一個src目錄,這是JAVA原始檔的目錄,有一個build目錄,這是JAVA編譯後文件(.class檔案等)的存放目錄
那麼,我們在Test類中應該如何分別獲得
file1.txt file2.txt file3.txt file4.txt這四個檔案呢?
首先講file3.txt與file4.txt
file3.txt:
方法一:File file3 = new File(Test.class.getResource("file3.txt").getFile());
方法二:File file3 = new File(Test.class.getResource("/javaapplication/file3.txt").getFile());
方法三:File file3 = new File(Test.class.getClassLoader().getResource("javaapplication/file3.txt").getFile());
file4.txt:
方法一:File file4 = new File(Test.class.getResource("/file4.txt").getFile());
方法二:File file4 = new File(Test.class.getClassLoader().getResource("file4.txt").getFile());
很好,我們可以有多種方法選擇,但是file1與file2檔案呢?如何獲得?
答案是,你只能寫上它們的絕對路徑,不能像file3與file4一樣用class.getResource()這種方法獲得,它們的獲取方法如下
假如整個project目錄放在c:/下,那麼file1與file2的獲取方法分別為
file1.txt
方法一:File file1 = new File("c:/project/src/javaapplication/file1.txt");
方法二:。。。沒有
file2.txt
方法一:File file2 = new File("c:/project/src/file2.txt");
方法二:。。。也沒有
總結一下,就是你想獲得檔案,你得從最終生成的.class檔案為著手點,不要以.java檔案的路徑為出發點,因為真正使用的就是.class,不會拿個.java檔案就使用,因為java是編譯型語言嘛
至於getResouce()方法的引數,你以class為出發點,再結合相對路徑的概念,就可以準確地定位資原始檔了,至於它的根目錄嘛,你用不同的IDE build出來是不同的位置下的,不過都是以頂層package作為根目錄,比如在Web應用中,有一個WEB-INF的目錄,WEB-INF目錄裡面除了web.xml檔案外,還有一個classes目錄,沒錯了,它就是你這個WEB應用的package的頂層目錄,也是所有.class的根目錄“/”,假如clasaes目錄下面有一個file.txt檔案,它的相對路徑就是"/file.txt",如果相對路徑不是以"/"開頭,那麼它就是相對於.class的路徑。。
還有一個getResourceAsStream()方法,引數是與getResouce()方法是一樣的,它相當於你用getResource()取得File檔案後,再new InputStream(file)一樣的結果
Windows絕對路徑:
以root根目錄/開始的路徑 如/ 表示root根目錄 Linux相對路徑: ./ 指的是當前目錄 ../ 指的是當前目錄的上一級目錄 .代表當前目錄,..代表上級目錄 好像是統一的。
在windows或者Linux獲取配置檔案如:.properties檔案時
使用Class.getResource或者ClassLoader.getResource獲取絕對路徑classpath時返回的值如下不同
1 | String basepath=Thread.currentThread().getContextClassLoader().getResource( "" ).toString(); |
Windows輸出
1 | basepath=file:/D:/Workspaces/edu.bizoss.com/WebRoot/WEB-INF/classes/ |
Linux輸出
1 | basepath=file:/Workspaces/edu.bizoss.com/WebRoot/WEB-INF/classes/ |
因此獲取絕對路徑的擷取的也就不同
12345 | if (System.getProperty( "file.separator" ). equals ( "\\" )){ return basepath.substring(6,basepath.length()); } else { return basepath.substring(5,basepath.length()); } |
相關推薦
java中Class.getResource用法(用於配置檔案的讀取)
用JAVA獲取檔案,聽似簡單,但對於很多像我這樣的新人來說,還是掌握頗淺,用起來感覺頗深,大常最經常用的,就是用JAVA的File類,如要取得c:/test.txt檔案,就會這樣用File file = new File("c:/test.txt");這樣用有什麼問題,相信大
Java中Socket的用法(一) 普通Socket的簡單用法
Java中網路通訊是通過Socket實現的,Socket分為ServerSocket和Socket兩大類,ServerSocket用於服務端,可以通過accept方法監聽請求,監聽到請求後返回Socket,Socket用於具體完成資料傳輸,客戶端直接使用Socket發起請求並
java中return的用法(備忘)
Java中return語句總是和方法有密切關係,return語句總是用在方法中,有兩個作用,一個是返回方法指定型別的值(這個值總是確定的),一個是結束方法的執行(僅僅一個return語句)。 結果: 當i=4時,直接就跳出迴圈了。 Return有一個特性,就是一旦呼叫r
Java中Class.forName()用法詳解
Class.forName()主要功能 Class.forName(xxx.xx.xx)返回的是一個類, Class.forName(xxx.xx.xx)的作用是要求JVM查詢並載入指定的類,也就是說JVM會執行該類的靜態程式碼段。 下面,通過解答以下三個問題的來詳細講解下
java:Mybatis框架1(基本配置,log4j)
屬性 apache led sta sql inpu ack ima 文件中 1.mybatis01: db.properties: driver=com.mysql.jdbc.Driver url=jdbc:mysql://localhost:3
JAVA中只有值傳遞(用內存理解)
合並 形參 java 註意 拷貝 引用數據類型 基本類 壓棧 數據 剛剛上路的小夥盤們牢記哦,JAVA只有值傳遞,八大基本類型傳遞的是值。所有當調用帶有基本類型參數的方法時會把這個方法和他的局部變量一起合並成棧幀然後壓棧,註意方法的參數也是這個方法的局部變量,所以當實參將值
Java中2 5D遊戲(斜45度角)的設計與實現 1
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!  
IOS中NSUserDefaults的用法(輕量級本地資料儲存)
NSUserDefaults適合儲存輕量級的本地資料,比如要儲存一個登陸介面的資料,使用者名稱、密碼之類的,個人覺得使用NSUserDefaults是首選。下次再登陸的時候就可以直接從NSUserDefaults裡面讀取上次登陸的資訊咯。 因為如果使用自己建立的plist檔
Servlet3.0中Servlet的使用(註解&&配置檔案)
Servlet3.0中Servlet的使用 目錄 1.註解配置 2.非同步呼叫 3.檔案上傳 相對於之前的版本,Servlet3.0中的Servlet有以下改進: l 支援註解配置。 l 支援非同步呼叫。 l 直接有對檔案上傳的支援。
python中類的用法(物件的私有屬性)
物件的私有屬性:在某個類中宣告的私有屬性,只有在這個類宣告的範圍內才能呼叫這個私有屬性,一旦超出這個範圍,將無法訪問到,但若要訪問,可以通過在類裡宣告函式來實現對私有函式的檢視或修改。 可通過以下的程式具體理解: #物件的私有屬性 class People(object)
Qt中QStackedLayout類用法(選單葉切換介面)
本文主要總結用QStackedLayout類的用法,主要通過新建一個例項,體現QStackedLaout類可以應用在切換選單上。QStackedLaout類是屬於佈局管理器中的一個常用類。下面是一個例項,該例項是頂部兩個選單按鈕,分別點選兩個按鈕,將會切換不同頁面。比如點選p
sql語句中的join用法(可視化解釋)
完全 匹配 sele gin amp 並集 。。 idt 設有 一、innerjoininnerjoin總結來說就是 ,如A知道通往B如何走;B知道通往C如何走;但是A不知道通往C如何走,但是A可以通過B獲得去往C的通往方式。。首先,假設有A,B兩張表,結構及數據如下:IN
springcloud:config配置中心(多配置檔案引入)
解決客戶端引入多個檔案問題。 比如我一個服務需要載入公共的配置(資料庫/redis連線),還要載入私有配置,我希望把他們放兩個私有檔案中分別載入。可是發現client只會讀取bootstrap.properties中配置的spring.cloud.config.name相應的配置。如何解決這
java中ArrayList用法詳解,基本用法(含增刪改查)
1、什麼是ArrayList ArrayList就是動態陣列,它提供了①動態的增加和減少元素 ②實現了ICollection和IList介面 ③靈活的設定陣列的大小ArrayList是一個其容量能夠動態增長的動態陣列。它繼承了AbstractList,實現了List、Rand
Java中Class類詳解、用法以及泛化
在前面我們將類的載入的時候,類載入一共有5步,載入,驗證,準備,解析和初始化。其中載入階段,除了將位元組碼載入到方法區,還生成了這個了的Java.lang.Class物件。那麼這個Class物件到底有什麼用呢? 前面的關於反射的文章,我們多次都用到了Class類,可以用這個
java 使用jacob 呼叫中控考勤機dll(詳細配置)
根據網上內容搜尋以及不斷嘗試,總結出以下java使用jacob呼叫中控考勤機sdk方法 1、jacob-1.18版本 2、jdk1.732位(經過測試jacob目前只支援32位jdk,64位下報錯); 3、將jacob.jar 放入專案 WEB-INFO/lib下匯入: 4
Java中的反射機制(一)
erl void port 令行 sage [0 ray 輸出 我們 基本概念 在Java運行時環境中,對於任意一個類,能否知道這個類有哪些屬性和方法?對於任意一個對象,能否調用它的任意一個方法? 答案是肯定的。 這種動態獲取類的信息以及動態調用對象的方法的功能
JAVA中的枚舉(一)
enum 枚舉 在實際編程中,往往存在著這樣的“數據集”,它們的數值在程序中是穩定的,而且“數據集”中的元素是有限的。例如星期一到星期日七個數據元素組成了一周的“數據集”,春夏秋冬四個數據元素組成了四季的“數據集”。在Java中想表示這種數據集最容易想到的寫法可能是這樣,我們以表示一周五天的工作日來舉
java中的instanceof用法詳解
定義 xtend print 繼承 interface 參數 保留 如果 ack instanceof是Java的一個二元操作符(運算符),也是Java的保留關鍵字。它的作用是判斷其左邊對象是否為其右邊類的實例,返回的是boolean類型的數據。用它來判斷某個對象是否是
Java中static關鍵字用法總結
副本 大括號 跟著 rac clas main 靜態成員變量 abstract 全局變量 1. 靜態方法 通常,在一個類中定義一個方法為static,那就是說,無需本類的對象即可調用此方法 聲明為static的方法有以下幾條限制: · 它們僅能調用其他的sta