java – 为什么Image.IO.read()在这种情况下返回null?

ImageLoader.java:

public class ImageLoader {
    private static BufferedImage image;

    public ImageLoader() {
    }

    public BufferedImage loadImage(String filePath) throws IOException {
        image = ImageIO.read(this.getClass().getResourceAsStream(filePath));
        return image;
    }

    public static BufferedImage loadImage(Class classPath, String filePath) throws IOException {
        image = ImageIO.read(classPath.getResourceAsStream(filePath));
        return image;
    }
}

Library.java:

public class Library {
    public static final String ResourcePath = "./res/";
    public static final String ImagePath = ResourcePath + "Images/";
}

以三种方式使用ImageLoader.java:

> BufferedImage test = new ImageLoader().loadImage(Library.ImagePath“imageFile.png”);
> BufferedImage test = new ImageLoader().loadImage(Main.class,Library.ImagePath“imageFile.png”);
> BufferedImage test = new ImageLoader().loadImage(“/ Images /”“imageFile.png”);

为什么只有第三种情况起作用而第一种和第二种情况不起作用?我相信它与Library.ImagePath静态变量有关.

如果有办法解决它,请在下面说明!

最佳答案 看起来它与您的图像路径有关.展开变量时,值为

./res/Images

但是从你的第三个例子看,它看起来像是在类路径中

/Images/imageFile.png

因此,请尝试将ImagePath更改为:

public static final String ImagePath = "/Images/";

这里的区别是(注意:我只是从现在开始猜测),在类路径中,图像似乎部署在Images文件夹中.在文件系统上,您似乎在启动应用程序的根文件夹中有一个“res”文件夹.

假设你的文件夹结构如下:

myProject
+--- res
|    +---Images
|    \---Texts
\--- src

当你在myProject中启动应用程序,并且res在你的类路径上时,当你通过classpath或通过File加载时,图像的路径会有所不同:

new File("./res/Images/..."); //Relative to the working directory of the app!
classPath.getResourceAsStream("/Images/..."); //Root is your classpath, i.e. "res"!
点赞