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

时间:2015-05-28 19:52:49

标签: java netbeans jar

我知道很多次都会问过同样的问题,但是通过已经发布的所有答案,我找不到解决方案。

首先,这是我在项目中遇到问题后用来测试问题的代码:

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时尝试使用默认设置,但是我对这个问题感到很失望。

任何提示或想法都会非常感激!

3 个答案:

答案 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)

这里有两个问题。

  1. Windows不区分大小写。其他平台和jar名称内部区分大小写。

  2. getClass()类确定资源在哪个jar / class路径中。特别是单元测试不会放在罐子里,或者子类可能位于罐子外面。使用SomeClassInJar.class或使用ClassLoader搜索所有jar / class路径。类加载器仅使用绝对路径,您不能使用/启动路径。