首頁 >Java >java教程 >將檔案載入輸入流時,「ClassLoader.getResourceAsStream()」和「Class.getResourceAsStream()」有何不同?

將檔案載入輸入流時,「ClassLoader.getResourceAsStream()」和「Class.getResourceAsStream()」有何不同?

Linda Hamilton
Linda Hamilton原創
2024-12-23 17:21:15660瀏覽

How Do `ClassLoader.getResourceAsStream()` and `Class.getResourceAsStream()` Differ When Loading Files as InputStreams?

將檔案載入為InputStream的不同方法

傳遞的檔案名稱的解釋存在細微的差異。基本上有兩種不同的方法:ClassLoader.getResourceAsStream() 和 Class.getResourceAsStream()。這兩種方法以不同的方式找到資源。

在 Class.getResourceAsStream(path) 中,路徑被解釋為呼叫它的類別的包內的路徑。例如,呼叫 String.class.getResourceAsStream("myfile.txt") 將在類別路徑中的下列位置尋找檔案:「java/lang/myfile.txt」。如果您的路徑以 / 開頭,它將被視為絕對路徑,並且搜尋將從類路徑的根開始。因此,當您呼叫 String.class.getResourceAsStream("/myfile.txt") 時,它會查看類別路徑中的下列位置:./myfile.txt。

ClassLoader.getResourceAsStream(path) 將所有路徑視為絕對路徑。因此,如果您呼叫String.class.getClassLoader().getResourceAsStream("myfile.txt") 和String.class.getClassLoader().getResourceAsStream("/myfile.txt"),在這兩種情況下,它將位於類別路徑中在以下位置尋找檔案:./myfile.txt。

每當我在這篇文章中提到一個位置時,它可能是一個檔案系統本身或對應 JAR 檔案中的位置,具體取決於您從中載入資源的類別和/或 ClassLoader。

在您的情況下,您正在從應用程式伺服器載入類,因此你應該使用Thread.currentThread().getContextClassLoader().getResourceAsStream(filename) 而不是this.getClass().getClassLoader() .getResourceAsStream(filename) 。 this.getClass().getResourceAsStream() 也有效。

閱讀本文以獲取有關此特定問題的更多資訊。

Tomcat 7 及更低版本用戶的注意事項

這個問題的答案之一指出我對 Tomcat 7 的解釋似乎不正確。我試圖弄清楚為什麼會這樣。

所以我查看了不同 Tomcat 版本的 Tomcat WebAppClassLoader 的原始碼。 findResource(String name) 的實作(最終負責請求資源的 URL)在 Tomcat 6 和 Tomcat 7 中幾乎相同,但在 Tomcat 8 中有所不同。

在版本 6 和 7 中,實作不會嘗試規範化資源名稱。這表示在這些版本中, classLoader.getResourceAsStream("/resource.txt") 可能不會給出與 classLoader.getResourceAsStream("resource.txt") 相同的結果,即使它應該(如 Javadoc 所述)。 [原始碼]

但是,在版本8中,資源名稱被規範化,以確保使用資源名稱的絕對版本。因此,上述兩個呼叫在 Tomcat 8 中應始終產生相同的結果。 [原始碼]

因此,在 Tomcat 8 之前的版本上使用 ClassLoader.getResourceAsStream() 或 Class.getResourceAsStream() 時需要格外小心。而且您還必須記住,class.getResourceAsStream("/resource.txt") 實際上呼叫了 classLoader.getResourceAsStream("resource.txt")(刪除了前導 /)。

以上是將檔案載入輸入流時,「ClassLoader.getResourceAsStream()」和「Class.getResourceAsStream()」有何不同?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn