2016-03-23 77 views
0

在下面的代碼示例中,當我在Eclipse中測試代碼時,它工作得很好。然而,當我出口的jar文件,並通過命令行測試,它拋出一個錯誤:IIOException: Can't read input file!導出的jar文件不會讀取jar文件裏面的文件

private BufferedImage img = null; 
private String imgSource; 

if (img == null) 
{ 
    try { 
     URL url = getClass().getResource("Images/questionMark.png"); 
     System.out.println(url.getPath()); 
     /* This prints: file:/C:/Users/Keno/Documents/javaFile.jar!/javaFile/Images/questionMark.png */ 
     File file = new File(url.getPath()); 
     img = ImageIO.read(file); 
     imgSource = file.getName(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

文件我想獲得位於圖像文件夾這是javaFile包內內。我注意到一件事可能表明問題。

  1. 在我有的print語句中,我注意到javaFile.jar部分末尾有一個感嘆號。那是對的嗎?這可能表明文件或結構有問題嗎?

而且,萬一有人有更好的建議,我應該怎麼加載的文件,我會告訴你我的意圖。我想從jar中的相對位置(Images文件夾)加載文件。我想顯示它(已經在我的實際代碼中完成),並將稍後傳遞的位置存儲到另一個函數(也完成)。

+3

嘗試的getClass()。的getResourceAsStream –

+0

@ oliv37這將意味着我不得不把網址成一個InputStream。然後我需要將其轉換爲文件嗎? –

+0

ImageIO.read(inputStream) –

回答

1

試試這個

public void test() { 
    try(InputStream is = getClass().getResourceAsStream("Images/questionMark.png")) { 
     ImageIO.read(is); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 
+0

所以它的工作,但我唯一擔心的是,使用InputStream似乎比從文件讀取慢一點。有什麼辦法可以加速它或什麼? –

+0

我不認爲這比用文件參數調用read方法慢。如果您查看讀取方法的源代碼 - > http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/7u40-b43/javax/imageio/ImageIO.java#ImageIO .read%28java.io.File%29你會看到它創建了一個inputStream。 –

+0

噢,這可能意味着我的代碼中的其他內容似乎會減慢速度。我知道現在的問題是什麼。再次感謝! –

0

您應該嘗試檢查您的課程與您的jar中的圖片是否位於相同的目錄中。

| 
    |- Your class 
    |- Images 
     |- questionMark.png 

另外,你有沒有嘗試過直接使用你的url對象?

File file = new File(url); 
+0

你不能從一個url對象創建一個文件。 –

+0

我的錯誤,我的意思是URI而不是URL – Webster