HashMap不保存条目

时间:2015-01-08 20:00:27

标签: java hashmap textures

我的问题是,我试图制作一个资源加载器,将过去的纹理保存到HashMap,并将其位置作为关键。它在将图像加载到包外时非常有效,但是当它试图加载内部图像时它就不会保存。

这是我的资源加载器代码

public Map<String,BufferedImage> loads = new HashMap<String,BufferedImage>();

public BufferedImage loadImage(String imagePath){

    BufferedImage temp = new BufferedImage(9, 16, BufferedImage.TYPE_INT_RGB);

    String location = imagePath.replaceAll("[.]", "/");
    location += ".png";

    //internal
    if(location.startsWith("CLASS_")){
        if(loads.get(location) != null){
            System.out.println("OLD");
            return loads.get(location);
        }else{
            location = location.replaceAll("CLASS_", "");
            try{
                temp = ImageIO.read(this.getClass().getClassLoader().getResource("net/minegeek360/platformer/assets/"+location));
                loads.put(location, temp);
            }catch(Exception e){System.err.println("CANT LOAD IMAGE");}
            System.out.println("NEW | "+temp);
        }
    //external
    }else{
        try{
            if(loads.get(location) != null){
                //System.out.println("LOADED ORIGIONAL IMAGE");
                return loads.get(location);
            }else{
                temp = ImageIO.read(new File("assets/textures/"+location));
                //System.out.println("LOADED NEW IMAGE");
            }
        }catch(Exception e){ e.printStackTrace(); }
        loads.put(location, temp);
    }

    return temp;
}

正如我所说,外部装载工作完美,它只是内部装载问题。它正确加载所有图像所以我知道BufferedImages不是问题,这就是为什么我认为它是HashMaps。

3 个答案:

答案 0 :(得分:2)

当数据放入地图时,前缀“CLASS_”将从用作密钥的位置删除。

但是,从地图中查询数据时,前缀仍然存在。

请问您可以为内部部件试用此代码并从控制台提供输出吗?

if(location.startsWith("CLASS_")){
    location = location.replaceFirst("CLASS_", "");
    if(loads.get(location) != null){
        System.out.println("OLD");
        return loads.get(location);
    } else {
        try{
            temp = ImageIO.read(this.getClass().getClassLoader().getResource("net/minegeek360/platformer/assets/"+location));
            System.out.println("Loading image, current size: " + loads.size());
            loads.put(location, temp);
            System.out.println("Image loaded,  new size:     " + loads.size());
        }catch(Exception e){System.err.println("CANT LOAD IMAGE");}
        System.out.println("NEW | "+temp);
    }
}

答案 1 :(得分:0)

  

负载永远不会添加任何东西!即使它在我的代码中,它什么都不做!

疑。

您检查内部加载的图像如下:

if(location.startsWith("CLASS_")){
    if(loads.get(location) != null){

如果你没找到,那么就像这样加载它:

        location = location.replaceAll("CLASS_", "");
        try{
            temp = ImageIO.read(this.getClass().getClassLoader().getResource("net/minegeek360/platformer/assets/"+location));
            loads.put(location, temp);

您当然会存储图像,但对以前加载的内部图像的测试永远不会成功,因为您使用不同的密钥(所有外观都已移除"CLASS_")来存储它们,而不是您以后尝试使用的他们了。

答案 2 :(得分:0)

问题是我有同一个加载器的多个实例。所以我只是让我的文件只访问一个实例。