您需要區分文件和資源。每個文件也是一種資源,但反之亦然。在JAR文件中,您沒有文件,但只有資源。
加載資源也使用類加載器完成。因此,您必須首先檢索類加載器,然後使用它加載資源:
ClassLoader loader = Thread.currentThread().getContextClassLoader();
URL resourceUrl = loader.getResource(resourceName);
try (InputStream in = resourceUrl.openStream()) {
// load bytes from the input stream here
}
// process the loaded resource bytes here
現在在哪裏放置文件?您可以將它們放入JAR的根目錄中。在您的項目中,這意味着將資源文件放入文件夾src
。或者你將它們放入一個包裝中,讓它們放在需要它的班級旁邊。
如果放入根目錄,則只能通過資源名稱訪問它們。如果放在一個子目錄(一個包)中,您必須在資源名稱前加上該路徑 - 來自根目錄的beginngin。例如:
URL resourceUrl = loader.getResource("my/pkg/win.txt");
只是一個方便:如果資源文件被放置在同一個包中的類,正需要這個資源,你也可以使用類本身加載(而不是類加載器):
URL resourceUrl = getClass().getResource("win.txt");
注意,在這種情況下,目錄結構被省略。
在你的例子中,你創建了一個文件對象。如果您稍後使用該文件對象創建FileInputStream
,則可以使用上面描述的InputStream
而不是那個。
如果你不隱藏你的類和包的名字會更容易。 – PeterMmm