getresourceasstream - java getresource path




Class.getResource()和ClassLoader.getResource()之間有什麼區別? (5)

Class.getResources會通過加載對象的類加載器檢索資源。 而ClassLoader.getResource將使用指定的類加載器來檢索資源。

我想知道Class.getResource()ClassLoader.getResource()之間的區別是什麼?

編輯:我特別想知道是否有任何緩存涉及文件/目錄級別。 如“在Class版本中緩存的目錄列表?”

AFAIK以下應該基本上做同樣的事情,但他們不是:

getClass().getResource() 
getClass().getClassLoader().getResource()

我在擺弄某些報告生成代碼時發現了這一點,該代碼在該目錄中的現有文件中創建WEB-INF/classes/中的新文件。 當使用Class中的方法時,我可以使用getClass().getResource()找到在部署時存在的文件,但是當試圖獲取新創建的文件時,我收到了一個空對象。 瀏覽目錄清楚地顯示新文件在那裡。 文件名前面加了一個正斜杠,如“/myFile.txt”中所示。

另一方面, getResource()ClassLoader版本確實找到了生成的文件。 從這個經驗看來,目錄列表正在進行某種緩存。 我是對的嗎?如果是這樣,那麼記錄在哪裡?

Class.getResource()API文檔

查找具有給定名稱的資源。 用於搜索與給定類關聯的資源的規則由類的定義類加載器來實現。 這個方法委託給這個對象的類加載器。 如果此對象由引導類加載器加載,則該方法委託給ClassLoader.getSystemResource(java.lang.String)。

對我來說,這是“Class.getResource真的調用它自己的類加載器的getResource()”。 這與getClass().getClassLoader().getResource() 。 但顯然不是。 有人能為我提供一些有關這個問題的啟示嗎?


Class.getResource可以採用“相對”資源名稱,該名稱相對於類的包進行處理。 或者,您可以使用前導斜杠指定“絕對”資源名稱。 Classloader資源路徑總是被認為是絕對的。

所以以下基本相同:

foo.bar.Baz.class.getResource("xyz.txt");
foo.bar.Baz.class.getClassLoader().getResource("foo/bar/xyz.txt");

這些也是如此(但它們與上述不同):

foo.bar.Baz.class.getResource("/data/xyz.txt");
foo.bar.Baz.class.getClassLoader().getResource("data/xyz.txt");

必須查看它的規格:

類的getResource() - 文檔指出了區別:

在對資源名稱進行這些更改後,此方法將調用委託給其類加載器:如果資源名稱以“/”開頭,則不會改變; 否則,在轉換“。”之後,軟件包名稱會預先添加到資源名稱中。 至 ”/”。 如果此對象由引導加載程序加載,則該調用將委派給ClassLoader.getSystemResource。


我嘗試從input1.txt中讀取,它與我正在嘗試讀取它的類中的一個包中

以下工作:

String fileName = FileTransferClient.class.getResource("input1.txt").getPath();

System.out.println(fileName);

BufferedReader bufferedTextIn = new BufferedReader(new FileReader(fileName));

如果你想要正確的字符串格式的路徑名,最重要的部分是調用getPath()不要使用toString()因為它會添加一些額外的格式化文本,這將完全滿足文件名(您可以嘗試它並看到打印輸出)。

花了2小時調試這個...... :(


這裡的所有答案以及這個問題的答案都表明,加載絕對URL,比如“/foo/bar.properties”,class.getResourceAsStream(String class.getResourceAsStream(String)class.getClassLoader().getResourceAsStream(String) 。 情況並非如此,至少在我的Tomcat配置/版本中(當前是7.0.40)。

MyClass.class.getResourceAsStream("/foo/bar.properties"); // works!  
MyClass.class.getClassLoader().getResourceAsStream("/foo/bar.properties"); // does NOT work!

對不起,我絕對沒有令人滿意的解釋,但我想那個tomcat和類加載器一樣骯髒的竅門和黑魔法,並且造成了不同。 我總是在過去使用class.getResourceAsStream(String)並沒有任何問題。

PS:我也在here發布





getresource