一、項目結構
1、首先,項目的目錄結構大概是這樣
二、資源文件存放路徑
1、類路徑下的資源一般放在 src 下。假如先在src的根目錄下新建一個a.txt 文件。
2、實際上a.txt會被加載到:\項目名\out\artifacts\項目擴展名WEB-INF\classes\a.txt (如果是IDEA,路徑大概就是這樣。當然,如果是其他編譯工具幫你生成的路徑和這個不一樣,也不影響後續的獲取)
自動加載後的文件目錄
三、獲取類路徑下的資源方式
1、方式一: ClassLoader
(1)、該方式的路徑是相對於/classes,開頭沒有斜杆的
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//得到ClassLoader 先得到Class,在得到ClassLoader
ClassLoader c1=this.getClass().getClassLoader();
//調用其getResourceAsStream,得到一個InputStream
InputStream input = c1.getResourceAsStream("a.txt");
//讀取輸入流,轉成字符串
String s = IOUtils.toString(input);
//輸出
System.out.println(s);
}
如果資源文件不是直接在src下,而是在其他包下面,如:a.txt 在 com/sunlee/test/ 下 ,如圖:
那麼,只要改成:getResourceAsStream("com/sunlee/test/a.txt") 即可,注意:開頭沒有斜杆的
代碼如下:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//得到ClassLoader 先得到Class,在得到ClassLoader
ClassLoader c1=this.getClass().getClassLoader();
//調用其getResourceAsStream,得到一個InputStream
InputStream input = c1.getResourceAsStream("com/sunlee/test/a.txt");
//讀取輸入流,轉成字符串
String s = IOUtils.toString(input);
System.out.println(s);
}
2、方式二:Class
(1)、該方式是相對於該.class文件所在目錄
(2)、注意:src下的java文件會被編譯成class文件放在 /classes下
(3)、注意:開頭還是沒有斜杆的
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//得到Class
Class c = this.getClass();
//相對於當前.class文件所在目錄
InputStream input = c.getResourceAsStream("a.txt");
//讀取輸入流,轉成字符串
String s = IOUtils.toString(input);
System.out.println(s);
}
看到這裏可能會有疑問:既然相對於.class文件,那如果我的資源文件和.class文件不同目錄怎麼辦?
這種情況下,可修改代碼爲:getResourceAsStream("/a.txt"); 注意:這裏加了一個斜杆,表示相對classes下。沒錯,如果加了斜杆就和上面classLoader效果一樣的了,當然,classLoader是沒有前面加斜杆一說的。
代碼貼上:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//得到Class
Class c = this.getClass();
//相對於當前.class文件所在目錄
InputStream input = c.getResourceAsStream("/a.txt");
//讀取輸入流,轉成字符串
String s = IOUtils.toString(input);
System.out.println(s);
}
以上就是獲取類路徑下的資源的兩種方式