2012-09-12 60 views
1

我有一個表格與代碼:無法加載一個BufferedImage

public Form() 
{ 
    initComponents(); 
    try 
    { 
     File file= new File("avatar.jpg"); 
     BufferedImage image= ImageIO.read(file); 
    } 
    catch (IOException ex) 
    { 
     System.out.println("Failed to load image"); 
    } 
} 

的問題是,代碼總是拋出IOException異常,並在catch塊進入。
所以文件沒有被讀取。
我已經創建的項目使用Netbeans 7.2和目錄如下:

Directory

什麼問題?也許該文件不應該在那裏,但在父目錄?或者是什麼?

+3

在問別人之前總是看看異常。 –

+1

用stracktrace替換自定義異常消息,然後將其發佈到此處。 – user1329572

回答

1

你的圖像被打包在你的jar中嗎?要找到這個,像提取一個普通的壓縮文件一樣提取你的jar文件,並檢查圖像是否在那裏(通常位於jarname \包名\文件名。如果是這樣,那麼你需要提取圖像作爲一個資源使用getResourceAsStream()

這會是這樣的:

public class Test { 
    private static final String absName = "/yourpackage/yourimage.jpg"; 

    public static void main(String[] args) { 
    Class c=null; 
    try { 
     c = Class.forName("yourpackage.Test");//pkg is the package name in which the resource lies 
    } catch (Exception ex) { 
     // This should not happen. 
    } 
    InputStream s = c.getResourceAsStream(absName); 
    // do something with it. 
    } 

    public InputStream getResourceAsStream(String name) { 
     name = resolveName(name); 
     ClassLoader cl = getClassLoader(); 
     if (cl==null) { 
     return ClassLoader.getSystemResourceAsStream(name); // A system class. 
     } 
     return cl.getResourceAsStream(name); 
    } 

    public java.net.URL getResource(String name) { 
     name = resolveName(name); 
     ClassLoader cl = getClassLoader(); 
     if (cl==null) { 
     return ClassLoader.getSystemResource(name); // A system class. 
     } 
     return cl.getResource(name); 
    } 

    private String resolveName(String name) { 
     if (name == null) { 
     return name; 
     } 
     if (!name.startsWith("/")) { 
     Class c = this; 
     while (c.isArray()) { 
      c = c.getComponentType(); 
     } 
     String baseName = c.getName(); 
     int index = baseName.lastIndexOf('.'); 
     if (index != -1) { 
      name = baseName.substring(0, index).replace('.', '/') + "/" + name; 
     } 
     } else { 
     name = name.substring(1); 
     } 
     return name; 
    } 
} 

參考:

0

沒有看到錯誤我會說最可能的原因是它無法找到該文件。所以我建議你用File的構造函數中的「avatar.jpg」替換爲它的絕對文件路徑。例如

File file = new File("INSERT_PATH_TO_FILE/avatar.jpg"); 
1

它看起來像你的poker.* 命名空間這一切都取決於JVM是從初始化。 你的主要地方在哪裏?它在/Users/ramy/NetBeansProjects/Poker/src

此外,我建議你使用getResource()滿足你所有的文件加載需求,特別是在罐子裏。

this.getClass().getResource("/resource/buttons1.png") 
or 
this.getClass().getResourceAsStream("/resource/TX_Jello2.ttf") 

你可以找出你的程序的默認路徑是通過執行以下操作:

System.getProperty("user.dir"); 
0

你不能假設的形象將是「有」,因爲你的.java與圖像之間的相對路徑似乎沒問題。

訪問資源取決於項目的「種類」(Web,standalone ....)。在你的情況下,你可以嘗試從你的類路徑中獲取圖像

final File inputFile = new ClassPathResource("....").getFile(); 
    final BufferedImage inputImg = ImageIO.read(inputFile);