我想问过类似的问题,但我找不到解决方案。我正在研究基于Java Swings的绘画应用程序。 我需要为BufferedImage类创建一个实例,以便保存我绘制的图像。我想选择一张背景图片,我会画一些东西。我有一些预定义的背景图像集,我放在与源文件相同的文件夹中,并访问代码中的那些文件。在Netbeans中运行时,代码可以正常运行。如果我构建并运行jar文件,则表示无法读取输入文件。我开始知道我们无法直接在jar中访问该文件,所以我使用了以下代码:
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 :(得分:1)
jar文件的内容区分大小写。这可能听起来很愚蠢,但你检查了文件的情况吗?如果你有文件File.jpg,那么加载file.jpg将无法正常工作。甚至扩展都区分大小写(file.JPG vs file.jpg)。
答案 1 :(得分:0)
由于您的解决方案与解释here相同,我认为您只是忘记将包裹包含在路径中,即:
InputStream is = this.getClass().getClassLoader().getResourceAsStream("package1/package2/.../bg3.jpg");
bgfile=ImageIO.read(is);
答案 2 :(得分:0)
完整的堆栈跟踪可能会有所帮助。但是,如果您对异常的描述是准确的,则不会告诉您它无法找到图像文件。它告诉你它无法读取它。你确定jpg文件没有损坏或者由于某些其他原因无法识别为ImageIO类的jpg吗?
如果资源为null,ImageIO.read()方法会给出一个带有input == 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")));