簡體   English   中英

getResourceAsStream()僅在jar文件中返回null

[英]getResourceAsStream() returns null only when in jar file

我知道同樣的問題被問過很多次,但是經歷了已經發布的所有答案,我找不到解決方案。

首先,這是我在我的項目中遇到它后用來測試問題的代碼:

InputStream test;

System.out.println(this.getClass());
System.out.println(("classpath is: " + System.getProperty("java.class.path")));

test = getClass().getResourceAsStream("/pairs/images/100/back/back1.png");

if (test == null)
{
    System.out.println("getClass().getResourceAsStream(\"/pairs/images/100/back/back1.png\") is null");
    test = GridPanel.class.getClassLoader().getResourceAsStream("pairs/images/100/back/back1.png");
}

if (test == null)
{
    System.out.println("GridPanel.class.getClassLoader().getResourceAsStream(\"pairs/images/100/back/back1.png\") is null");
    test = ClassLoader.getSystemClassLoader().getResourceAsStream("pairs/images/100/back/back1.png");
}

if (test == null)
{
    System.out.println("ClassLoader.getSystemClassLoader().getResourceAsStream(\"pairs/images/100/back/back1.png\") is null");
    Thread.currentThread().getContextClassLoader().getResourceAsStream("pairs/images/100/back/back1.png");
}

if (test == null)
    System.out.println("Thread.currentThread().getContextClassLoader().getResourceAsStream(\"pairs/images/100/back/back1.png\") is null");

因此,根據標題,這些對getResourceAsStream()的調用都會返回null,但只有在執行jar文件時,當在IDE(Netbeans 8.0.2)中啟動時,它們都返回正確的流(單獨測試不使用這段代碼)我可以用它。

jar文件內容如下: http://i.stack.imgur.com/1y8i8.png

netbeans項目文件夾中的src文件夾如下: http://i.stack.imgur.com/AXj7s.png

所以我現在真的很困惑,我在使用netbeans構建時嘗試使用默認設置,但我對這個問題感到很失望。

任何提示或想法將不勝感激!

我認為getResourceAsStream不是從文件系統讀取的,前導斜杠將嘗試從類路徑的根讀取(如果添加目錄將從根讀取)。 如果你沒有放置前導斜杠,你將從類來自的包中讀取。

您是否在類路徑中添加了要讀取文件的目錄/子目錄?

TL; DR這是由於NTFS權限的一些愚蠢問題,移動jar使其工作

所以我現在覺得很蠢......

我嘗試在Linux環境中運行它,一切都按照假設運行。 這些調用中的每一個都返回一個指向資源的非null InputStream。

所以我做了一件非常簡單的事情:只是在Windows中編譯的jar中移動以檢查它是否與NTFS權限有關(請記住我使用的是管理員帳戶,我可以在這些文件夾中自由編寫,讀取和執行)。 將它移動到項目的根目錄不起作用,但在桌面上移動它。

令我感到驚訝的是,在我正在做的項目的其他部分

URL jarUrl = PairsDeck.class.getProtectionDomain().getCodeSource().getLocation();

讀取jar文件的整個內容,即使在舊目錄中也是如此,所以這就是為什么我從一開始就沒有想過搞過權限(我從具有管理員權限的命令提示符啟動它)。

所以我想不管怎樣,程序可以通過該調用讀取它的jar,但是由於NTFS權限的一些問題,不能從我的netbeans項目文件夾中加載它。

增加一些困惑

File file = new File(jarUrl.toURI());
file.canWrite();
file.canRead();
file.canExecute(); 

以上所有都返回true。

我只是想知道是否有辦法更好地理解這個問題,並且可能有辦法從java代碼中發出一些權限錯誤信號。

衷心感謝所有參與幫助的人!

這里有兩個問題。

  1. Windows不區分大小寫。 其他平台和jar名稱內部區分大小寫。

  2. getClass()類確定資源在哪個jar / class路徑中。 特別是單元測試不會放在罐子里,或者子類可能位於罐子外面。 使用SomeClassInJar.class或使用ClassLoader搜索所有jar / class路徑。 類加載器僅使用絕對路徑,並且不能使用/啟動路徑。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM