getResourceAsStream和getResource的用法及Demo實例 用JAVA獲取文件,聽似簡單,但對於不少像我這樣的新人來講,仍是掌握頗淺,用起來感受頗深,你們最常常用的,就是用JAVA的File類,如要取得 D:/test.txt文件,就會這樣用File file = newFile("D:/test.txt");這樣用有什麼問題,相信你們都知道,就是路徑硬編碼,對於JAVA精神來講,應用應該一次成型,處處可 用,而且從現實應用來說,最終生成的應用也會部署到Windows外的操做系統中,對於linux來講,在應用中用了c:/這樣的字樣,就是失敗,因此, 咱們應該儘可能避免使用硬編碼,即直接使用絕對路徑。 在Servlet應用中,有一個getRealPath(String str)的方法,這個方法儘管也能夠動態地得到文件的路徑,不祕直接手寫絕對路徑,但這也是一個不被建議使用的方法,那麼,咱們有什麼方法能夠更好地得到文件呢? 那就是Class.getResource()與Class.getResourceAsStream()方法! 1、getResourceAsStream用法 首先,Java中的getResourceAsStream有如下幾種: 1. Class.getResourceAsStream(String path) : path 不以’/'開頭時默認是今後類所在的包下取資源,以’/'開頭則是從 ClassPath根下獲取。其只是經過path構造一個絕對路徑,最終仍是由ClassLoader獲取資源。 2. Class.getClassLoader.getResourceAsStream(String path) : 默認則是從ClassPath根下獲取,path不能以’/'開頭,最終是由 ClassLoader獲取資源。 3. ServletContext. getResourceAsStream(String path): 默認從WebAPP根目錄下取資源,Tomcat下path是否以’/'開頭無所謂, 固然這和具體的容器實現有關。 4. Jsp下的application內置對象就是上面的ServletContext的一種實現。 其次,getResourceAsStream 用法大體有如下幾種: 第一: 要加載的文件和.class文件在同一目錄下,例如:com.x.y 下有類me.class ,同時有資源文件myfile.xml 那麼,應該有以下代碼: Java代碼 me.class.getResourceAsStream("myfile.xml"); 第二:在me.class目錄的子目錄下,例如:com.x.y 下有類me.class ,同時在 com.x.y.file 目錄下有資源文件myfile.xml 那麼,應該有以下代碼: Java代碼 me.class.getResourceAsStream("file/myfile.xml"); 第三:不在me.class目錄下,也不在子目錄下,例如:com.x.y 下有類me.class ,同時在 com.x.file 目錄下有資源文件myfile.xml 那麼,應該有以下代碼: Java代碼 me.class.getResourceAsStream("/com/x/file/myfile.xml"); 總結一下,可能只是兩種寫法 第一:前面有 「 / 」 「 / 」表明了工程的根目錄,例如工程名叫作myproject,「 / 」表明了myproject Java代碼 me.class.getResourceAsStream("/com/x/file/myfile.xml"); 第二:前面沒有 「 / 」 表明當前類的目錄 Java代碼 me.class.getResourceAsStream("myfile.xml"); me.class.getResourceAsStream("file/myfile.xml"); 2、getResource用法 好比咱們有如下目錄 |--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 (三種獲取方式): Java代碼 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:(二種獲取方式): Java代碼 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 Java代碼 File file1 = new File("c:/project/src/javaapplication/file1.txt"); file2.txt Java代碼 File file2 = new File("c:/project/src/file2.txt"); 總結一下: 就是你想得到文件,你得從最終生成的.class文件爲着手點,不要以.java文件的路徑爲出發點,由於真正使用的就是.class,不會拿個.java文件就使用,由於java是編譯型語言。 至 於getResouce()方法的參數,你以class爲出發點,再結合相對路徑的概念,就能夠準確地定位資源文件了,至於它的根目錄,你用不一樣的 IDEbuild出來是不一樣的位置下的,不過都是以頂層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)同樣的結果 。 class.getResource("/") --> 返回class文件所在的頂級目錄,通常爲包名的頂級目錄。 --> file:/home/duanyong/workspace/cxxx/xxxx/bin/WEB-INF/classes/ class.getResource("/xxx.txt") --> 返回頂級目錄下的xxx.txt路徑。 file://..../bin/WEB-INF/classes/xxx.txt getResource(String path),path是以class文件的頂級目標所在的相對路徑。若是頂級目錄爲classes,在classes/xxx/yyy.txt這樣一個文 件。取得yyy.txt的語法爲:class.getResource("/xxx/yyy.txt"); Java代碼 //取得classes頂級目錄下的/xxx/yyy.txt文件 System.out.println(Test.class.getResource("/xxx/yyy.txt")); //取得本class的上路徑 System.out.println(Test.class.getResource(Test.class.getSimpleName() + ".class")); 結果: file:/home/duanyong/workspace/test/bin/WEB-INF/classes/xxx/yyy.txt file:/home/duanyong/workspace/test/bin/WEB-INF/classes/cn/duanyong/test/Test.class 3、getResourceAsStream與getResource用法比較實例 注:testpinyin.txt 放於項目的src下 Java代碼 import java.io.IOException; import java.io.InputStream; public class Test { public void getResource(String url){ InputStream stream = getClass().getResourceAsStream(url); System.out.println(getClass().getResource(url)); byte[] line = new byte[1024*1024]; try { stream.read(line); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } String str = new String(line); System.out.println(str.trim()); } public static void main(String[] args) { new Test().getResource("/testpinyin.txt"); } } 運行結果: file:/E:/workspace/testhttpclient/bin/testpinyin.txt emergency 第一行獲得的是testpinyin.txt的路徑,第二行是testpinyin.txt的內容。 須要注意的是必須有前面的「/」,「/」表明的是工程名,不然找不到。