001package com.ganteater.ae; 002 003import java.io.BufferedInputStream; 004import java.io.File; 005import java.io.FileInputStream; 006import java.util.Enumeration; 007import java.util.HashMap; 008import java.util.Map; 009import java.util.zip.ZipEntry; 010import java.util.zip.ZipFile; 011import java.util.zip.ZipInputStream; 012 013public final class JarResources { 014 015 private Map<String, Integer> htSizes = new HashMap<>(); 016 private Map<String, byte[]> htJarContents = new HashMap<>(); 017 private File jarFileName; 018 019 public JarResources(File jarFileName) { 020 this.jarFileName = jarFileName; 021 init(); 022 } 023 024 public byte[] getResource(String name) { 025 return (byte[]) htJarContents.get(name); 026 } 027 028 private void init() { 029 try { 030 ZipFile zf = new ZipFile(jarFileName); 031 Enumeration<? extends ZipEntry> e = zf.entries(); 032 while (e.hasMoreElements()) { 033 ZipEntry ze = (ZipEntry) e.nextElement(); 034 htSizes.put(ze.getName(), new Integer((int) ze.getSize())); 035 } 036 zf.close(); 037 038 FileInputStream fis = new FileInputStream(jarFileName); 039 BufferedInputStream bis = new BufferedInputStream(fis); 040 try (ZipInputStream zis = new ZipInputStream(bis)) { 041 ZipEntry ze = null; 042 while ((ze = zis.getNextEntry()) != null) { 043 if (ze.isDirectory()) { 044 continue; 045 } 046 047 int size = (int) ze.getSize(); 048 if (size == -1) { 049 size = ((Integer) htSizes.get(ze.getName())).intValue(); 050 } 051 052 byte[] b = new byte[(int) size]; 053 int rb = 0; 054 int chunk = 0; 055 while (((int) size - rb) > 0) { 056 chunk = zis.read(b, rb, (int) size - rb); 057 if (chunk == -1) { 058 break; 059 } 060 rb += chunk; 061 } 062 063 htJarContents.put(ze.getName(), b); 064 } 065 } 066 } catch (NullPointerException e) { 067 // 068 } catch (Exception e) { 069 e.printStackTrace(); 070 } 071 } 072 073}