getResourceAsStream和getResource的用法及Demo實例

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的內容。
須要注意的是必須有前面的「/」,「/」表明的是工程名,不然找不到。
相關文章
相關標籤/搜索