2011-05-18 105 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)。