我构建了一个在运行时加载图像的Java应用程序。图像的位置相对于项目是固定的。
我希望能够在Eclipse和命令行中运行该程序,并且能够正确加载图像。但是,我只能做一个或另一个但不能两者兼而有之。这看起来像是一件微不足道的事情,但我不知道该怎么做。
设置项目,以便为输出创建bin目录,并将图像放在resources子文件夹中。从命令行运行时这很好,因为我可以编写代码来查看该文件的子文件夹。
但是当我从eclipse中运行程序时,当前的工作目录是不同的。
我错过了什么?
TIA
更新 - 添加一些代码
这就是我原来的:
BufferedImage awtImage = ImageIO.read(new File(System.getProperty("user.dir") + "/resources/image-name.png"));
根据评论中的建议我尝试使用getResourceAsStream
,但我不知道要传递给File构造函数。
InputStream temp = MyClass.class.getResourceAsStream("resources/image-name.png");
BufferedImage awtImage = ImageIO.read(new File(???));
正在找到资源,因为temp不为null。
答案 0 :(得分:0)
我认为有两种解决方案。
1)指定绝对路径
2)您的图像位于类路径中,因此您可以通过以下方式加载它:
YouClass.class.getResourceAsStream("YourImg.png");
答案 1 :(得分:0)
工作目录,如果这真的是你的意思,那么加载图像不是一个好地方。您似乎有一个图像,您将与完成的程序一起分发,以便程序可以使用它。在这种情况下,我建议您使用Class.getResourceAsStream()
,并将图像放在该类目录中(或附近)。
编辑:
以下是我在其中一个程序中用于类似目的的代码:
ImageIcon expandedIcon = null;
// ...
expandedIcon = new ImageIcon(TreeIcon.class.getResource("images/Expanded.png"));
ImageIcon
类是Swing的一部分;我不知道你是否正在使用它,但这应该可以向你展示这个想法。 getResource()方法接受一个URL;再一次,你可能需要一些不同的东西。但是这显示了相对于调用该方法的类的路径的路径名,因此如果TreeIcon
位于x / y / z / icons中,则PNG文件需要位于x / y / z / icons中/ images,无论在哪台计算机上。
TreeIcon是我的一类,它的内部结构对你没有帮助,所以我不发布它们。它在这里所做的就是为我加载到ImageIcon实例中的PNG文件提供一个位置。
除了处理具有目录结构的磁盘之外,这也适用于jar文件(这是分发java程序或库的常用方法)。 jar文件只是一个zip文件,jar / zip文件中的每个文件都有与之关联的目录,因此图像可以在正确的目录中的jar中,就像java类在它们的目录中一样。
getResourceAsStream()
返回一个流;如果要将该字节流用作图像加载,请找到一个将流转换为图像类可用作构造函数或加载方法的类并将其连接起来的类。这是一个常见的事情,必须弄清楚Java i / o,遗憾的是在所有图像和情况下没有烹饪方法可以做到这一点,所以我们不能告诉你它是什么。
编辑2:
从评论中,请尝试:
ImageIO.read(new File(MyClass.class.getResource("resources/image-name.png");
答案 2 :(得分:0)
我设置了这样的Eclipse项目。
输入目录被添加到类路径中(Eclipse中的JavaBuildPath)。
最后,您可以像这样访问图像和/或文本文件。
private BufferedImage getIconImage() {
try {
return ImageIO.read(getClass().getResourceAsStream(
"/StockMarket.png"));
} catch (IOException e) {
e.printStackTrace();
return null;
}
}