2015-12-23 117 views
4

ImageLoader.java:爲什麼Image.IO.read()在這種情況下返回null?

public class ImageLoader { 
    private static BufferedImage image; 

    public ImageLoader() { 
    } 

    public BufferedImage loadImage(String filePath) throws IOException { 
     image = ImageIO.read(this.getClass().getResourceAsStream(filePath)); 
     return image; 
    } 

    public static BufferedImage loadImage(Class classPath, String filePath) throws IOException { 
     image = ImageIO.read(classPath.getResourceAsStream(filePath)); 
     return image; 
    } 
} 

Library.java:

public class Library { 
    public static final String ResourcePath = "./res/"; 
    public static final String ImagePath = ResourcePath + "Images/"; 
} 

使用ImageLoader.java在三個方面:

  1. BufferedImage test = new ImageLoader().loadImage(Library.ImagePath + "imageFile.png");

  2. BufferedImage test = new ImageLoader().loadImage(Main.class, Library.ImagePath + "imageFile.png");

  3. BufferedImage test = new ImageLoader().loadImage("/Images/" + "imageFile.png");

爲什麼只有3次的情況下工作,並且第一和第二種情況不?我相信這與靜態變量Library.ImagePath有關。

如果有辦法解決它,請在下面介紹!

+0

你正在使用哪個''Library'''類?'Library.ImagePath''在你的情況下有什麼值? –

+1

@DavidTanzer哦,對,讓我補充一點,這個問題! –

+0

你確定你需要''/'在'ResourcePath'開頭而不是'/'? – Ferrybig

回答

2

看起來它與您的圖像路徑有關。當您展開變量的值是

./res/Images 

但是從你的第三個例子,它看起來像圖像在類路徑在

/Images/imageFile.png 

因此,嘗試改變的ImagePath到:

public static final String ImagePath = "/Images/"; 

這裏的區別是(注意:我只是從現在開始猜測),那就是在你的類路徑中,這些圖像似乎被部署在Images文件夾中。在文件系統上,您似乎在啓動應用程序的根文件夾中有一個「res」文件夾。

說你的文件夾結構看起來像這樣:

myProject 
+--- res 
| +---Images 
| \---Texts 
\--- src 

當你開始在myProject應用程序,並res是在classpath那麼當你通過類路徑或通過文件加載路徑的圖像會有所不同:

new File("./res/Images/..."); //Relative to the working directory of the app! 
classPath.getResourceAsStream("/Images/..."); //Root is your classpath, i.e. "res"! 
+0

工作感謝您的幫助! –

+0

因爲你有一個叫做/ Images的CLASSPATH條目,當然沒有叫/ res/Images。 – EJP

+1

太棒了!這讓一噸更有意義! –

相關問題