我知道很多次都会问过同样的问题,但是通过已经发布的所有答案,我找不到解决方案。
首先,这是我在项目中遇到问题后用来测试问题的代码:
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时尝试使用默认设置,但是我对这个问题感到很失望。
任何提示或想法都会非常感激!
答案 0 :(得分:1)
我认为getResourceAsStream不是从文件系统读取的,前导斜杠将尝试从类路径的根读取(如果添加目录将从根读取)。如果您没有放置前导斜杠,您将从该类来自的包中读取。
您是否在类路径中添加了要读取文件的目录/子目录?
答案 1 :(得分:0)
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代码中发出一些权限错误。
全心全意地感谢所有参与帮助的人!
答案 2 :(得分:-1)
这里有两个问题。
Windows不区分大小写。其他平台和jar名称内部区分大小写。
getClass()
类确定资源在哪个jar / class路径中。特别是单元测试不会放在罐子里,或者子类可能位于罐子外面。使用SomeClassInJar.class
或使用ClassLoader搜索所有jar / class路径。类加载器仅使用绝对路径,您不能使用/
启动路径。