2011-05-18 106 views
4

我猜想类似的问题已经被问到,但我找不到解决方案。我只是在基于Java Swings的绘画应用程序上工作。 我需要为BufferedImage类创建一个实例,以保存我绘制的图像。我想选择一幅背景图片,我会画出一些东西。我有一些预定义的背景图像集,放在与源文件相同的文件夹中,并访问代码中的那些背景图像。代码在Netbeans中运行时完美运行。如果我构建并运行jar文件,它说无法读取输入文件。我才知道,我们不能直接访问该文件罐中,所以我用下面的代码:无法读取输入文件 - 读取jar文件中包含的图像-java

InputStream is = this.getClass().getClassLoader().getResourceAsStream("bg3.jpg"); 
bgfile=ImageIO.read(is); 

bgfile是BufferedImage类的一个对象。所以一旦我作为一个jar文件运行,下面的IOexception被抛出:

无法读取输入文件!

但是,如果我用winrar打开jar文件,我可以在jar文件的根目录下找到文件bg3.jpg。 如果我将路径设置为“/bg3.jpg”,则jar文件本身不会打开。

所以我需要一些帮助和解释。提前致谢。

回答

0

由于您的解决方案是为解释here一样的,我觉得你只是忘记包括在包中的路径,即:

InputStream is = this.getClass().getClassLoader().getResourceAsStream("package1/package2/.../bg3.jpg"); 
bgfile=ImageIO.read(is); 
0

完整的堆栈跟踪会可能有所帮助。但是,如果您对异常的描述是准确的,则不会告诉您无法找到图像文件。它告诉你它无法读取它。你确定这个jpg文件没有损坏,或者由于其他原因不能识别为ImageIO类的jpg文件?

如果资源为空,ImageIO.read()方法会提供一个异常,其输入原因为== null。我认为这是找到它。它只是不能读取它作为一个jpg文件(虽然很难确定没有完整的堆栈跟踪)。

如果您的图片资源确实位于jar文件的顶层,那么您不需要任何前导文件分隔符。所以,如果你的罐子看起来是这样的:

1523 Tue Mar 30 23:14:50 CDT 2010 org/apache/log4j/xml/SAXErrorHandler.class<br> 
286 Tue Mar 30 23:14:50 CDT 2010 org/apache/log4j/xml/UnrecognizedElementHandler.class<br> 
4109 Tue Mar 30 23:14:52 CDT 2010 org/apache/log4j/xml/XMLLayout.class<br> 
745 Tue Mar 30 23:14:52 CDT 2010 org/apache/log4j/xml/XMLWatchdog.class<br> 
7028 Tue Mar 30 23:14:34 CDT 2010 org/apache/log4j/xml/log4j.dtd<br> 
911 Wed May 11 14:31:30 CDT 2011 redball.gif 

您将加载与redball.gif:

Image image = (ImageIO.read(this.getClass().getClassLoader().getResource("redball.gif"))); 
1

一个jar文件的内容是区分大小写的。这可能听起来很愚蠢,但是你检查了文件大小吗?如果你有文件File.jpg,那么加载file.jpg将不起作用。即使扩展区分大小写(file.JPG vs file.jpg)。