Programovanie

Tip 49 pre Java: Ako extrahovať prostriedky Java z archívov JAR a ZIP

Väčšina programátorov v Jave má celkom jasno v tom, aké výhody má použitie súboru JAR na zoskupenie všetkých rôznych zdrojov (tj. Súborov .class, zvukov a obrázkov), ktoré obsahujú ich riešenie Java. (Ak nie ste oboznámení so súbormi JAR, pozrite si časť Zdroje nižšie.) Veľmi častá otázka ľudí, ktorí práve začínajú začleňovať súbory JAR do svojej tašky trikov, je: „Ako extrahujem obrázok z JAR? “ Odpovieme na túto otázku a poskytneme triedu, vďaka ktorej bude extrahovanie ľubovoľného zdroja z JAR super jednoduché!

Načítava sa obrázok GIF

Povedzme, že máme súbor JAR, ktorý obsahuje veľa obrazových súborov .gif, ktoré chceme použiť v našej aplikácii. Tu je príklad, ako sme mohli získať prístup k obrazovému súboru z JAR pomocou JarResources:

 JarResources jar = new JarResources ("Images.jar"); Logo obrázka = Toolkit.getDefaultToolkit (). CreateImage (jar.getResource ("logo.gif"); 

Tento útržok kódu ukazuje, že môžeme vytvoriť JarResources objekt inicializovaný do súboru JAR obsahujúci zdroj, ktorý máme záujem použiť - Images.jar. Potom použijeme JarResources 'getResource () metóda poskytovania nespracovaných údajov zo súboru logo.gif pre súbory nástrojov AWT createImage () metóda.

Poznámka k pomenovaniu

JarResource je primerane priamym príkladom toho, ako používať rôzne zariadenia poskytované Java 1.1 na manipuláciu s archívnymi súbormi JAR a zip.

Krátka poznámka o pomenovaní. Podpora archivácie v Jave skutočne začala pomocou populárneho formátu archivácie zip (pozrite si „Tip Java 21: Načítanie appletu urýchlite pomocou archívnych súborov“). Takže pôvodne, pri implementácii podpory Javy na manipuláciu s archívnymi súbormi, boli všetky triedy a čo ešte umiestnené v balíku java.util.zip; tieto triedy majú sklon začínať „PSČ. "Ale niekde pri prechode na Java 1.1 sú právomoci, ktoré zmenili názov archívu, viac zamerané na Javu. To, čo dnes nazývame súbory JAR, sú teda v podstate súbory zip.

Ako to funguje

Dôležité dátové polia pre JarResources triedy sa používajú na sledovanie a ukladanie obsahu zadaného súboru JAR:

public final class JarResources {public boolean debugOn = false; private Hashtable htSizes = new Hashtable (); private Hashtable htJarContents = new Hashtable (); private String jarFileName; 

Takže inštancia triedy nastaví názov súboru JAR a potom zavolá na init () spôsob vykonania celej skutočnej práce:

 public JarResources (String jarFileName) {this.jarFileName = jarFileName; init (); } 

Teraz init () metóda v podstate len načíta celý obsah zadaného súboru JAR do hashtable (prístupnej cez názov zdroja).

Toto je dosť statná metóda, poďme ju teda rozobrať o niečo ďalej. The ZipFile trieda nám poskytuje základný prístup k informáciám o hlavičke archívu JAR / zip. Je to podobné ako s informáciami o adresári v súborovom systéme. Tu uvádzame zoznam všetkých položiek v ZipFile a vybudovať htVeľkosti hashtable s veľkosťou každého zdroja v archíve:

 private void init () {try {ZipFile zf = new ZipFile (jarFileName); Výpočet e = zf.entries (); while (e.hasMoreElements ()) {ZipEntry ze = (ZipEntry) e.nextElement (); if (debugOn) {System.out.println (dumpZipEntry (ze)); } htSizes.put (ze.getName (), new Integer ((int) ze.getSize ())); } zf.close (); 

Ďalej pristupujeme k archívu pomocou nástroja ZipInputStream trieda. The ZipInputStream trieda robí všetko to kúzlo, aby nám umožnila prečítať každý z jednotlivých zdrojov v archíve. Čítame presný počet bajtov z archívu, ktorý obsahuje každý zdroj, a tieto údaje ukladáme do súboru htJarContents hashtable prístupný podľa názvu zdroja:

 FileInputStream fis = nový FileInputStream (jarFileName); BufferedInputStream bis = nový BufferedInputStream (fis); ZipInputStream zis = nový ZipInputStream (bis); ZipEntry ze = null; while ((ze = zis.getNextEntry ())! = null) {if (ze.isDirectory ()) {continue; } if (debugOn) {System.out.println ("ze.getName () =" + ze.getName () + "," + "getSize () =" + ze.getSize ()); } int size = (int) ze.getSize (); // -1 znamená neznámu veľkosť. if (size == - 1) {size = ((Integer) htSizes.get (ze.getName ())). intValue (); } bajt [] b = nový bajt [(int) veľkosť]; int rb = 0; int chunk = 0; while ((((int) size - rb)> 0) {chunk = zis.read (b, rb, (int) size - rb); if (chunk == - 1) {break; } rb + = kus; } // pridať do interného hashtable zdroja htJarContents.put (ze.getName (), b); if (debugOn) {System.out.println (ze.getName () + "rb =" + rb + ", size =" + size + ", csize =" + ze.getCompressedSize ()); }}} catch (NullPointerException e) {System.out.println ("hotovo."); } catch (FileNotFoundException e) {e.printStackTrace (); } catch (IOException e) {e.printStackTrace (); }} 

Názov, ktorý sa používa na identifikáciu každého prostriedku, je kvalifikovaný názov cesty prostriedku v archíve, nie, napríklad názov triedy v balíku - to znamená ZipEntry trieda z balíka java.util.zip bude mať názov „java / util / zip / ZipEntry“, a nie „java.util.zip.ZipEntry“.

Poslednou dôležitou súčasťou kódu je jednoduchý testovací ovládač. Testovací ovládač je jednoduchá aplikácia, ktorá prevezme názov archívu JAR / zip a názov prostriedku. Pokúsi sa nájsť zdroj v archíve a nahlási jeho úspech alebo neúspech:

 public static void main (String [] args) hodí IOException {if (args.length! = 2) {System.err.println ("use: java JarResources"); System.exit (1); } JarResources jr = nové JarResources (args [0]); byte [] buff = jr.getResource (args [1]); if (buff == null) {System.out.println ("Nepodarilo sa nájsť" + args [1] + "."); } else {System.out.println ("Nájdené" + args [1] + "(length =" + buff.length + ")."); }}} // Koniec triedy JarResources. 

A tu to máte. Ľahko použiteľná trieda, ktorá skrýva všetku zmätok súvisiaci s používaním zdrojov zastrčených v súboroch JAR.

Cvičenia pre čitateľa

Teraz, keď máte pocit, že chcete extrahovať zdroje z archívneho súboru, je niekoľko rád, ktoré by ste mali preskúmať pri úprave a rozšírení JarResources trieda:

  • Namiesto toho, aby ste všetko naložili počas výstavby, urobte oneskorené načítanie. V prípade veľkého súboru JAR nemusí byť počas výstavby dostatok pamäte na načítanie všetkých súborov.
  • Namiesto jednoduchého poskytnutia všeobecnej metódy prístupu, ako je getResource (), mohli by sme poskytnúť ďalšie prístupové zdroje špecifické pre zdroje - napríklad getImage (), ktorá vracia Java Obrázok objekt, getClass (), ktorá vracia Java Trieda objekt (s pomocou prispôsobeného zavádzača tried) atď. Ak je súbor JAR dostatočne malý, mohli by sme vopred vytvoriť všetky zdroje na základe ich prípon (.gif, .class atď.).
  • Niektoré metódy by mali poskytovať informácie o samotnom danom súbore JAR (v podstate súhrnnom obale ZipFile), vrátane: počtu položiek Jar / zip; enumerátor, ktorý vráti všetky názvy zdrojov; prístupové objekty, ktoré vracajú dĺžku (a ďalšie atribúty) konkrétneho záznamu; a prístupový objekt, ktorý umožňuje indexovanie, aby sme vymenovali aspoň niektoré.
  • JarResources možno rozšíriť na použitie appletmi. Použitím parametrov appletu a URLConnection triedy je možné namiesto otvorenia archívov ako lokálnych súborov stiahnuť obsah JAR zo siete. Ďalej môžeme túto triedu rozšíriť ako vlastný obslužný program obsahu Java.

Záver

Ak ste túžili vedieť, ako extrahovať obrázok zo súboru JAR, teraz ste dostali spôsob. Nielen, že môžete manipulovať s obrázkami pomocou súboru JAR, ale s novou triedou uvedenou v tomto tipe tiež pracujete so svojou extrakčnou mágiou na akýkoľvek zdroj z JAR.

Arthur Choi v súčasnosti pracuje pre IBM ako poradný programátor. Pracoval pre niekoľko spoločností, vrátane SamSung Network Laboratory a MITER. Rôzne projekty, na ktorých pracoval, sú systémy klient / server, výpočty distribuovaných objektov a správa siete. Použil množstvo jazykov v rôznych prostrediach operačného systému. Programovať začal v roku 1981 programami FORTRAN IV a COBOL. Neskôr prešiel na C a C ++ a s Java pracuje asi dva roky. Najviac sa zaujíma o aplikácie Java v oblasti úložísk dát cez rozsiahle siete a paralelné a distribuované spracovanie cez internet (pomocou programovania na báze agentov). John Mitchell, zamestnanec, konzultant a riaditeľ svojej vlastnej spoločnosti, investoval posledných desať rokov do vývoja špičkového počítačového softvéru a do poradenstva a odbornej prípravy ďalších vývojárov. Poskytoval poradenstvo v oblasti technológií Java, kompilátorov, tlmočníkov, webových aplikácií a internetového obchodu. John je spoluautorom knihy Making Sense of Java: A Guide for Managers and the Rest of Us a publikoval články v programovacích časopisoch. Okrem písania stĺpca Tipy pre Java pre JavaWorld moderuje diskusné skupiny comp.lang.tcl.announce a comp.binaries.geos.

Získajte viac informácií o tejto téme

  • Tu je súbor triedy JarResources.java //www.javaworld.com/javatips/javatip49/JarResources.java
  • JAR //www.javasoft.com/products/jdk/1.1/docs/guide/jar/index.html
  • Viac informácií o podpore archivácie v prostredí Java nájdete v časti „Java Tip 21Použitie archívnych súborov na urýchlenie načítania appletu“ //www.javaworld.com/javatips/jw-javatip21.html

Tento príbeh, „Tip Java 49: Ako extrahovať prostriedky Java z archívov JAR a zip“, pôvodne publikoval server JavaWorld.

$config[zx-auto] not found$config[zx-overlay] not found