在我的IDE中,我能够获取资源文件夹中的图像路径,并通过执行以下操作使该路径成为新文件对象:
URL imagePath = getClass().getResource("/image.png");
try
{
//Convert the URLs into URIs and make a file object with that path
File image = new File(imagePath.toURI());
}
catch (URISyntaxException e)
{
e.printStackTrace();
}
但是当我制作我的程序的jar文件时,我得到的错误URI不是分层的。我做了一些研究,发现我必须使用getResourceAsStream()方法创建一个InputStream。但我不知道如何为图像做这项工作。我只需要能够从我的资源文件夹中获取图像的路径。即使它是一个罐子,我怎么能做这个工作。
答案 0 :(得分:2)
不要将URL
转换为File
引用,这会使嵌入式资源和嵌入资源只是zip文件中的条目失败,因此不能将它们视为File
。
相反,请使用ImageIO.read(imagePath)
有关详细信息,请参阅Reading/Loading an Image
答案 1 :(得分:1)
我认为在这种情况下,最佳解决方案是直接向ClassLoader
询问InputStream
(使用ClassLoader.getResourceAsStream
)并将其传递给ImageIO.read
。
这是一个完整的例子。
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.InputStream;
import javax.imageio.ImageIO;
public final class Main {
public static void main(final String[] args) {
final ClassLoader clsldr = Main.class.getClassLoader();
for (final String path : args) {
try {
InputStream is = null;
BufferedImage image = null;
try {
is = clsldr.getResourceAsStream(path);
if (is != null) {
image = ImageIO.read(is);
if (image != null) {
// Do something with the image.
System.out.printf("%s: %d x %d%n",
path,
image.getWidth(),
image.getHeight());
} else {
System.err.printf("error: %s: %s%n",
path,
"not a valid image file");
}
} else {
System.err.printf("error: %s: %s%n",
path,
"no such resource");
}
} finally {
if (is != null) {
is.close();
}
}
} catch (final IOException e) {
System.err.printf("error: %s: %s%n", path, e.getMessage());
}
}
}
}
假设我有一个图片文件photo.jpg
,然后编译上面的文件并创建一个这样的JAR文件
$ javac *.java
$ jar -cfe example.jar Main *.class photo.jpg
然后我可以像这样运行程序并获得以下输出。
$ java -jar example NoSuchThing Main.class photo.jpg
error: NoSuchThing: no such resource
error: Main.class: not a valid image file
photo.jpg: 328 x 328