我的类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设置可能是错误的。
3条答案
按热度按时间o2rvlv0m1#
它将根据类的位置搜索图像。由于类GamesState.Introstate位于Project/src(实际上在eclipse中它可能位于Project/bin),当您使用路径/Images/logo. png时,它将在Project/src/Images/logo.png中查找图像
lymnna712#
您应该将文件作为流读取
尝试使用:
字符串
或者
型
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.class
或this.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")
返回nullthis.getClass().getResourceAsStream("com/example/icon.PNG")
返回nullthis.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个字节,没有错误。