【问题标题】:Why is my BufferedImage receiving a null value from ImageIO.read()为什么我的 BufferedImage 从 ImageIO.read() 接收空值
【发布时间】:2011-11-01 00:03:27
【问题描述】:
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

【问题讨论】:

  • 确定该路径不是文件系统上的绝对路径,而是来自类路径的路径?

标签: java bufferedimage


【解决方案1】:

基本上,Class.getResourceAsStream 不会像您认为的那样做。

它会尝试获取与该类的类加载器相关的资源 - 因此,除非您有一个类加载器,并且您的文件系统根目录为 根目录,否则它不会找到您想要的文件。

听起来你应该很可能真的有类似的东西:

BufferedImage = ImageIO.read(getClass().getResourceAsStream("/Images/player.gif"))

(编辑:显示的原始代码不同,并且具有完整的文件系统路径。)

并确保将图像复制到适当的位置,以便当前类的类加载器获取Images 目录。当你把它打包成一个 jar 文件时,你也会想要 Images 目录。

编辑:这可能是问题:

首先,是的,我确实将图像文件夹添加到了我的类路径中。

images 文件夹不应该在类路径中 - Images 文件夹的 parent 应该是,这样当类加载器 寻找 Images 目录时,它会在它的根目录下找到它。

【讨论】:

  • 很高兴知道,谢谢,但它不能解决任何问题。无论如何,我的真实代码中实际上有 getResourceAsStream(IMAGE_DIR + fnm) 。只是想我应该把解决的问题放在这里。编辑原始帖子以显示这一点。
  • @user1022004:好吧,它会修复它如果类加载器设置适当,文件在适当的位置。我们不知道你是如何运行它的,你正在使用什么样的类加载器等等。请注意,Images 文件夹本身不应该在类路径中 - parent 文件夹应该是。
  • 好的,很抱歉造成混乱。我再次编辑以清除问题。如果现在有关于类路径的任何问题,您可以确定它们存在,而且不是我不清楚。
  • @Gixugif:您的最后一行还不清楚 - 您是否在任何地方传递“/DreamGame/Images/player.gif”?你的课程是如何部署的?你是如何运行你的代码的?
  • 当前在原​​始帖子中的行是所有被传递的;没有“/DreamGame/Images/player.gif”,只有“/Images/player.gif”。这是来自“ImagesLoader”类中的一个方法,该方法在“PlayerSprite”中的对象被创建时被调用。主类是 DreamGame。我正在使用“运行”选项直接从 Eclipse 运行代码。
【解决方案2】:

如果你使用resourceAsStream,“/”是指类路径条目的根目录,而不是文件系统的根目录。查看您正在使用的路径可能是原因。

如果您从某个主路径加载某些内容,您可能应该使用 FileInputStream。 getResourceAsStream 适用于您随应用部署的内容。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-29
    • 2021-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多