1. #1
    Avatar von uncopyable
    Registriert seit
    19.11.2011
    Beiträge
    282
    Thanked 235 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

    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.