无法读取输入文件 - 从jar文件中读取图像 - Java

4

我想类似的问题已经被问过了,但我找不到解决方案。我正在使用基于Java Swings的绘画应用程序。我需要创建一个BufferedImage类的实例以保存我所绘制的图像。我想选择一个背景图片,在上面绘制一些东西。我有一些预定义的背景图片,我将它们放在与源文件相同的文件夹中,并在代码中访问它们。当在Netbeans中运行代码时,它可以完美地工作。如果我构建并运行jar文件,则会显示“无法读取输入文件”。我得知我们不能直接访问jar中的文件,因此我使用了以下代码:

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

bgfile是BufferedImage类的一个对象。因此,一旦我将其作为jar文件运行时,会抛出以下IO异常:

无法读取输入文件!

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

因此,我需要一些帮助和解释。提前感谢您的帮助。

3个回答

1

jar文件的内容是区分大小写的。这听起来可能很愚蠢,但你检查了文件名的大小写吗?如果你有一个叫做File.jpg的文件,那么加载file.jpg是行不通的。甚至扩展名也是区分大小写的(file.JPG与file.jpg)。


0

由于您的解决方案与此处所解释的相同,我认为您只是忘记将包含在路径中,即:

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

0

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

如果资源为空,则ImageIO.read()方法会抛出一个输入为null的异常。我认为它已经找到了资源。只是无法将其作为jpg文件读取(尽管没有完整的堆栈跟踪很难确定)。

如果您的图像资源确实位于jar文件的顶层,则不需要任何前导文件分隔符。所以,如果您的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")));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接