对于以下代码段:
InputStream inputStream =
ClassLoader.getSystemClassLoader()
.getResource("pics/logo.jpg")
.openStream();
八位getResource
或openStream
返回null
。我该如何缓解这个问题?
您需要将'logo.jpg'放入相对于CLASSPATH根目录的'pics'目录中,否则,ClassLoader.getResource()将返回null,当您尝试基于它打开InputStream时会导致NPE 。
因此,使用带有此代码的Eclipse工作区...
import java.io.InputStream;
import java.net.URL;
public class GetResource {
public static void main(String[] args) throws Exception {
ClassLoader classLoader = ClassLoader.getSystemClassLoader();
URL resource = classLoader.getResource("pics/logo.jpg");
System.out.println("resource is " + resource);
InputStream inputStream = resource.openStream();
System.out.println("The inputStream was not null");
}
}
它将返回...
resource is null
Exception in thread "main" java.lang.NullPointerException
at GetResource.main(GetResource.java:9)
如果未找到相对于CLASSPATH根目录的“ pics / logo.jpg”。在正确的位置(在本例中为Eclipse项目的“ src / pics”文件夹,将其自动放入“ bin / pics”文件夹)中创建“ logo.jpg”文件,输出为...
resource is file:/home/joe/workspace/Play/bin/pics/logo.jpg
The inputStream was not null
通常,资源将捆绑在您的jar中,因此“ logo.jpg”应该位于jar根目录的“ / pics”目录中。
java.lang.Class.getResource()
和java.lang.ClassLoader.getResource()
之间对资源名称的解释有所不同:首先,给定名称是相对于该类的包的,除非它以'/'开头,否则将赋予该名称。第二个总是“绝对”。
这意味着当您呼叫java.lang.String.class.getResource( "resource/Doc.jpg" )
时,它将寻找/java/lang/resource/Doc.jpg
,而对java.lang.String.class.getClassLoader().getResource( "resource/Doc.jpg" )
的呼叫试图找到/resource/Doc.jpg
。
两者都不是真正的“路径”(就文件系统上的位置而言),它们确定相对于CLASSPATH的位置。该can是文件系统上的位置(如果资源不在JAR文件中……),但它也可以是对数据库记录的引用,以URI的形式提供,具体取决于类的实现涉及装载机。
要从*.jpg
文件加载*.jar
图像(或任何其他图像),请使用此架构:
创建一个项目,然后将其编译为*.jar
文件
project-with-resources
│
├── src
│ └── main
│ ├── java
│ │ ├── . . .
│ │ └── Project.java
│ └── resources
│ ├── . . .
│ └── image1.jpg
└── pom.xml
配置maven-resources-plugin
(可能有多个资源文件夹)
<build>
<defaultGoal>package</defaultGoal>
<resources>
<resource>
<directory>src/main/resources</directory>
<targetPath>resources</targetPath>
</resource>
. . .
</resources>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>3.1.0</version>
</plugin>
. . .
</plugins>
</build>
在Java
代码中,使用ImageIO
类将图片读取到BufferedImage
对象
public class Project {
public static void main(String[] args) throws IOException {
BufferedImage image =
ImageIO.read(Project.class
.getResourceAsStream("/resources/image1.jpg"));
}
}
必要时准备吸气剂
public class Project {
private BufferedImage image;
. . .
public BufferedImage getImage() {
return image;
}
}
在IDE中使用Maven *.jar
目标将项目构建到package
文件中>
“>]