8

我正在尝试将图像作为 BufferedImage 加载到我的 java 应用程序中,目的是让它在 JAR 文件中工作。我尝试使用ImageIO.read(new File("images/grass.png"));which 在 IDE 中有效,但在 JAR 中无效。

我也试过

(BufferedImage) new ImageIcon(getClass().getResource(
            "/images/grass.png")).getImage();

由于 NullPointerException,它甚至无法在 IDE 中工作。我尝试在路径中使用 ../images、/images 和 images 来执行此操作。这些都不起作用。

我在这里错过了什么吗?

4

1 回答 1

21

new File("images/grass.png")在文件系统的当前目录中查找目录 images,该目录是启动应用程序的目录。所以这是错误的。

ImageIO.read()返回一个 BufferedImage,并接受一个 URL 或一个InputStream作为参数。要从类路径中获取 URL InputStream,请使用Class.getResource()Class.getResourceAsStream()。并且路径以 / 开头,并从类路径的根目录开始。

因此,如果 Grass.png 文件位于类路径中的包下,则以下代码应该可以工作images

BufferedImage image = ImageIO.read(MyClass.class.getResourceAsStream("/images/grass.png"));

如果文件位于运行时类路径中,这将在 IDE 中工作。如果 IDE 将其“编译”到它的目标类目录中,那将会是这样。为此,该文件必须与您的 Java 源文件一起位于源目录下。

于 2013-06-09T07:47:20.337 回答