![](/img/trans.png)
[英]getResourceAsStream returns null when reading properties file
[英]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文件內容如下:
netbeans項目文件夾中的src文件夾如下:
所以我現在真的很困惑,我在使用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代碼中發出一些權限錯誤信號。
衷心感謝所有參與幫助的人!
這里有兩個問題。
Windows不區分大小寫。 其他平台和jar名稱內部區分大小寫。
getClass()
類確定資源在哪個jar / class路徑中。 特別是單元測試不會放在罐子里,或者子類可能位於罐子外面。 使用SomeClassInJar.class
或使用ClassLoader搜索所有jar / class路徑。 類加載器僅使用絕對路徑,並且不能使用/
啟動路徑。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.