我正在使用自定义方法从 resources/
文件夹。在生产过程中编程时,硬编码路径工作得很好( src/main/resources/
). 但是,在交付时,我需要使此路径相对于.jar根目录。所以我做了这个。
public static Image getImageFromFile(String file)
{
Image image = null;
try
{
String path = FileUtils.class.getClassLoader().getResource(file).toExternalForm();
System.out.println(path);
File pathToFile = new File(path);
image = ImageIO.read(pathToFile);
}
catch (IOException ex) {ex.printStackTrace();}
return image;
}
file:/C:/Users/Hugo/Desktop/Hugo/Java%20Workspace/ClashBot/bin/main/icons/level-label.png
javax.imageio.IIOException: Can't read input file!
at javax.imageio.ImageIO.read(Unknown Source)
at com.lycoon.clashbot.utils.FileUtils.getImageFromFile(FileUtils.java:55)
打印路径有效并指向相应的图片。但是,程序引发了一个ioexception。
为什么找不到文件?
2条答案
按热度按时间i5desfxk1#
你跳得太多了。很简单:
这就是你所需要的。注意,这意味着
path.png
文件的搜索位置与fileutils所在的位置完全相同(甚至是相同的“subdir”)。所以如果你有,比如说,关于C:\Projects\Hugo\MyApp\myapp.jar
如果你解开它,你会发现里面com/foo/pkg/FileUtils.class
,然后是字符串path.png
在那个jar里看看com/foo/pkg/path.png
. 换句话说,AnyClass.class.getResource("AnyClass.class")
将让类找到自己的类文件。如果你想从jar的“根”开始,添加一个斜杠,即。FileUtils.class.getResource("/path.png")
在同一个jar里看/path.png
在那个jar里。getResource
返回url。getResourceAsStream
返回一个流(需要关闭;像我一样使用try with resources)。几乎所有使用api的资源都会将这两个资源中的一个作为输入。例如,imageio这样做;它甚至需要一个url,这样您就可以使用其中一个:对。这是单行线。这将直接从jar文件中加载图像!
iszxjhcz2#
你可以试着用一个稍微不同的电话,像这样: