1. #1
    U-Hacks Routinier
    Avatar von uncopyable
    Registriert seit
    19.11.2011
    Beiträge
    282
    Thanked 234 Times in 120 Posts

    Standard [Java] ImageCache

    Guten Abend

    Hier mein ImageCache Klasse aus meinem Client Projekt.

    PHP-Code:
    package tools;

    import java.awt.Image;
    import java.io.File;
    import java.io.IOException;
    import java.io.InputStream;
    import java.util.Enumeration;
    import java.util.HashMap;
    import java.util.Map;
    import java.util.zip.ZipEntry;
    import java.util.zip.ZipFile;
    import javax.imageio.ImageIO;

    /** 
     * 
     * ImageCache.java 
     * 
     * Cache images from a zip file
     * 
     * @author uncopyable 
     *  
     * Version 1.0 Freitag, 1. Juni 2012 
     * 
     * 
     */ 


    public class ImageCache {
        
    // Maximale anzahl der Bilder
        
    private int maxCount;
        
    // HashMap
        
    private Map<StringImageimageCache = new HashMap<StringImage>();
        
    // Name der Zip Datei
        
    private String zipName;

        public 
    ImageCache(int maxCountString zipName) {
            
    this.maxCount maxCount;
            
    this.zipName zipName;
            
    loadImages();
        }

        
    /**
         * Lädt die Bilder aus dem Zip-Archiv in die HasMap
         */
        
    public void loadImages() {
            try {
                
    File f = new File(ImageCache.class.getResource("/res/" zipName)
                        .
    getPath());
                if (
    f.exists()) {
                    
    ZipFile zipFile = new ZipFile(f);
                    
    Enumeration enu zipFile.entries();
                    while (
    enu.hasMoreElements()) {
                        
    ZipEntry zipEntry = (ZipEntryenu.nextElement();

                        if (
    isImage(zipEntry.getName())) {
                            
    InputStream inputStream zipFile
                                    
    .getInputStream(zipEntry);
                            
    Image image ImageIO.read(inputStream);
                            
    putImage(zipEntry.getName(), image);
                        }
                    }

                }
            } catch (
    IOException e) {
                
    e.printStackTrace();
            }
        }

        
    /**
         * 
         * Fügt den Name sowie das Bild in die HashMap ein
         * 
         */
        
    public void putImage(String nameImage image) {
            
    int i this.imageCache.size();
            if (
    <= maxCount) {
                
    this.imageCache.put(nameimage);
            } else {
                
    System.out.println("HashMap full!");
            }
        }

        
    /**
         * Gibt ein Bild anhand des Namens aus dem Zip-Archiv zurück
         * 
         */
        
    public Image getImagesByName(String name) {
            try {
    File f = new File(ImageCache.class.getResource("/res/" zipName)
                        .
    getPath());
                if (
    f.exists()) {
                    
    ZipFile zipFile = new ZipFile(f);
                
    Enumeration enu zipFile.entries();
                while (
    enu.hasMoreElements()) {
                    
    ZipEntry zipEntry = (ZipEntryenu.nextElement();

                    if (
    zipEntry.getName().equals(name)) {
                        
    InputStream inputStream zipFile.getInputStream(zipEntry);
                        
    Image image ImageIO.read(inputStream);
                        return 
    image;
                    }
    }
                }
            } catch (
    IOException e) {
                
    e.printStackTrace();
            }
            return 
    null;
        }

        
    /**
         * Gibt ein Bild anhand des Namens aus der HashMap zurück
         * 
         */
        
    public Image getImage(String name) {
            if (
    name.isEmpty()) {
                return 
    null;
            }
            
    Image tmpImage this.imageCache.get(name);
            if (
    tmpImage == null) {
                
    tmpImage getImagesByName(name); 
                
    putImage(nametmpImage);
            }
            return 
    tmpImage;
        }

        
    /**
         * Gibt True zurück wenn s ein Bild ist sonst False
         *
         */
        
    private static boolean isImage(String s) {
            return 
    s.contains(".gif") | s.contains(".png") | s.contains(".jpg");
        }

        
    /**
         * Setzt die maximale Anzahl 
         */
        
    public void setMaxCount(int maxCount) {
            
    this.maxCount maxCount;
        }

        
    /**
         *  Löscht die HasMap
         */
        
        
    public void flush() {
            
    this.imageCache.clear();
        }
        
        
        
    /**
         *  Beispiel
         *  ImageCache chache = new ImageCache(100, "imgsj10a.zip");
         *  Image image = chache.getImage("kuecke2.gif");
         */

    Auch hier sind Verbesserungsvorschläge gerne gesehen
    Geändert von uncopyable (01.06.2012 um 18:44 Uhr)


    while( behappy() ) { code(); }

  2. The Following User Says Thank You to uncopyable For This Useful Post:

    DotNet (19.03.2016)

  3. #2
    U-Labs Routinier

    Registriert seit
    19.11.2011
    Beiträge
    496
    Thanked 412 Times in 268 Posts

    Standard AW: [Java] ImageCache

    Du könntest das mit Java 7 eingeführte try-with-resources nutzen, oder schließe die Ressourcen manuell.

    Wenn du Java 7 hast, kannst du dir in dieser Klasse auch ein wenig Tipparbeit sparen, dank des Diamond-Operators.
    Code:
    private Map<String, Image> imageCache = new HashMap<String, Image>();
    zu:
    Code:
    private Map<String, Image> imageCache = new HashMap<>();
    Ansonsten noch:
    Code:
    private static boolean isImage(String s) {
            return s.contains(".gif") | s.contains(".png") | s.contains(".jpg");
    }
    isImage("ausgetrickst.png.txt") würde fälschlicherweise true zurückgeben. Verwende statt contains(String s) lieber endsWith(String s). Hier sollen boolesche Werte verknüpft werden -> logisches Oder verwenden. Daraus ergibt sich auch der recht kleine Vorteil namens Short-Circuit-Evaluation. Endet die Bilddatei mit .gif, wird erst gar nicht mehr geprüft, ob es mit .png oder .jpg endet.

    return null; Geschichten würde ich vermeiden, und lieber Exceptions werfen. Ich persönlich finde das schöner.

  4. The Following User Says Thank You to Mr. White For This Useful Post:

    uncopyable (07.06.2012)

Ähnliche Themen

  1. Neuerungen in Java 8
    Von Nuebel im Forum Java
    Antworten: 9
    Letzter Beitrag: 25.12.2018, 02:54
  2. Antworten: 8
    Letzter Beitrag: 02.12.2013, 23:41
  3. Java EE 32 Bit?
    Von Pwned im Forum Java
    Antworten: 2
    Letzter Beitrag: 04.08.2012, 23:08
  4. Ubuntu Sun Java
    Von hYpercrites im Forum Linux
    Antworten: 3
    Letzter Beitrag: 20.06.2012, 15:17
  5. [Java] Timer
    Von rVs14 im Forum Java
    Antworten: 1
    Letzter Beitrag: 16.06.2012, 12:13
Diese Seite nutzt Cookies, um das Nutzererlebnis zu verbessern. Klicken Sie hier, um das Cookie-Tracking zu deaktivieren.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191