BufferedImage = ImageIO.read(getClass().getResourceAsStream("/Images/player.gif"));
首先,是的,我确实将图像文件夹添加到了我的类路径中。
为此,我收到错误java.lang.IllegalArgumentException: input == null!
我不明白为什么上面的代码不起作用。从我读到的一切,我不明白为什么它不会。我被告知我应该使用FileInputStream
代替GetResourceAsStream
,但正如我刚才所说,我不明白为什么。我已经阅读了有关这些方法和各种指南的文档,这看起来很有用。
编辑:好的,试着清除一些关于我在类路径中的内容。
这是在Eclipse中创建的项目。一切都在项目文件夹DreamGame
中,包括“Images”文件夹。当然,DreamGame
在类路径中。我知道这很有效,因为我正在/Images
中读取一个文本文件,其中包含代码中前面提供的gif信息。
所以我有:/DreamGame/Images/player.gif
编辑2:当前在原始帖子中的行是所有正在传递的行;没有/DreamGame/Images/player.gif
,只有/Images/player.gif
。这来自类ImagesLoader
中的一个方法,该方法在创建PlayerSprite
的对象时调用。主要类是DreamGame
。我正在使用Run
选项从Eclipse运行代码而没有特殊参数
试图弄清楚如何找到正在加载类的类加载器。对不起,与大多数人相比,我对此非常陌生。
好的,这就是getClassLoader()
让我:sun.misc.Launcher$AppClassLoader@4ba778
getClass().getResource(getClass().getName() + ".class")
返回/home/gixugif/Documents/projects/DreamGame/bin/ImagesLoader.class
图像文件也被放入bin
。要仔细检查,我从bin
删除了文件,清理了项目并运行它。仍有同样的问题,图像文件又回到bin
答案 0 :(得分:4)
基本上,Class.getResourceAsStream
没有按照您的想法行事。
它尝试获取相对于该类的类加载器的资源 - 因此,除非您的文件系统根目录为其根目录的类加载器,否则将无法找到您所访问的文件。 / p>
听起来你很可能真的有类似的东西:
BufferedImage = ImageIO.read(getClass().getResourceAsStream("/Images/player.gif"))
(编辑:显示的原始代码不同,并且有完整的文件系统路径。)
并确保将图像复制到适合当前类的类加载器的位置以获取Images
目录。将它打包到jar文件中时,你也需要Images
目录。
编辑:这个位可能是问题所在:
首先,是的,我确实将图像文件夹添加到了我的类路径中。
images文件夹不应该在classpath中 - Images文件夹的 parent 应该是,所以当classloader 查找时{{1} }目录,它会在它的根目录下找到它。
答案 1 :(得分:1)
如果使用resourceAsStream“/”引用类路径条目的根,而不是文件系统的根。看看你正在使用的路径可能是原因。
如果从某个主路径加载某些内容,则可能应该使用FileInputStream。 getResourceAsStream用于您使用应用程序部署的内容。