eclipse getClass().getResource找不到图像文件

nc1teljy  于 2023-08-04  发布在  Eclipse
关注(0)|答案(3)|浏览(171)

我的类IntroState.java具有以下路径:

Project/src/GameState/IntroState.java

字符串
我的图像位于:

Project/Resources/Images/logo.png


资源文件夹是源文件夹。我用日 eclipse 氧气。
我试着加载它:

new BufferedImage image = ImageIO.read(getClass().getResource("/Images/logo.png");


当我运行它时,我得到一个NullPointerException。这段代码在一个旧项目中工作得很好,但我的笔记本电脑死了,我不得不重新安装Eclipse并重做我的代码,从那时起它就停止工作了。有人看到问题了吗?我尝试了很多不同的路径,我有一种感觉,我的一些Eclipse设置可能是错误的。

o2rvlv0m

o2rvlv0m1#

它将根据类的位置搜索图像。由于类GamesState.Introstate位于Project/src(实际上在eclipse中它可能位于Project/bin),当您使用路径/Images/logo. png时,它将在Project/src/Images/logo.png中查找图像

lymnna71

lymnna712#

您应该将文件作为流读取
尝试使用:

getClass().getClassLoader().getResourceAsStream("Images/logo.png")

字符串
或者

getClass().getClassLoader().getResource("Images/logo.png")

ruoxqz4g

ruoxqz4g3#

比如说,在项目Project/src/com/example/icon.PNG中有一个资源文件。但这不是程序要寻找的地方。程序将在 classpath 中查找您的文件,该文件位于/out/target文件夹下,其中包含您编译的类。
通过运行System.getProperty("java.class.path")来精确了解您的类路径。它与OS $PATH变量具有相同的结构。
在资源文件位置的上下文中,absolute表示 * 相对于类路径 *,就好像类路径是文件系统的/
在资源文件的位置上下文中,相对表示 * 相对于编译后的类文件 *。
在Java中访问资源文件时,有三对选项需要考虑:
1.您可以通过使用ClassLoader(即this.getClass().getClassLoader()MyClass.class.getClassLoader()),或使用Class(即MyClass.classthis.getClass());
1.您可以通过提供绝对相对路径访问资源;
1.您可以获取资源的URL(即this.getClass().getClassLoader().getResource("com/example/icon.PNG")com.example.MyClass.class.getResource("icon.PNG")),也可以获取InputStream(即MyClass.class.getClassLoader().getResourceAsStream("com/example/icon.PNG"))this.getClass().getResourceAsStream("/com/example/icon.PNG")

您不能在类加载器中使用相对路径

绝对路径(相对于您的classpath),当您通过Class访问时,以/开头,但当您通过ClassLoader访问时,绝对路径不会以/开头。举例来说:

  • this.getClass().getResourceAsStream("/com/example/icon.PNG")查找文件;
  • this.getClass().getClassLoader().getResourceAsStream("/com/example/icon.PNG")返回null
  • this.getClass().getResourceAsStream("com/example/icon.PNG")返回null
  • this.getClass().getClassLoader().getResourceAsStream("com/example/icon.PNG")查找文件
  • com.example.package1.MyObj1.class.getResource("../icon.PNG")查找文件
  • com.example.MyClass.class.getResource("icon.PNG")查找文件
  • com.example.MyClass.class.getResource("com/example/icon.PNG")返回null

最后但并非最不重要的一点是,拥有资源文件的读取访问权限就足以将其复制到classpath(到out/production/target/等),因此即使它是 root 拥有的只读访问权限(chmod 444 icon.PNG),它仍然足以构建您的应用程序。如果资源文件在构建时不可读,则根本不会构建类路径,因此不必担心。如果你做了一个技巧,并取消了对已经在类路径上的资源的读访问权限(即你做chmod 000 /target/Project/com/example/icon.PNG),那么获得的URL仍然不会为空,但你将简单地从它读取0个字节,没有错误。

相关问题