Programiranje

Java Nasvet 49: Kako izvleči vire Java iz arhivov JAR in zip

Večina programerjev Java se precej dobro zaveda prednosti uporabe datoteke JAR za združevanje vseh različnih virov (tj. Datotek .class, zvokov in slik), ki sestavljajo njihovo rešitev Java. (Če datotek JAR ne poznate, si oglejte spodnji razdelek Viri.) Pogosto vprašanje, ki ga zastavljajo ljudje, ki šele začnejo vključevati datoteke JAR v svojo vrečko trikov, je: "Kako izvlečem sliko JAR? " Na to vprašanje bomo odgovorili in podali razred, s katerim bo zelo enostavno izvleči kateri koli vir iz JAR-a!

Nalaganje slike GIF

Recimo, da imamo datoteko JAR, ki vsebuje kup slikovnih datotek .gif, ki jih želimo uporabiti v naši aplikaciji. Evo, kako bi lahko s pomočjo JarResources dostopali do slikovne datoteke iz JAR:

 JarResources jar = nov JarResources ("Images.jar"); Slika logotipa = Toolkit.getDefaultToolkit (). CreateImage (jar.getResource ("logo.gif"); 

Ta delček kode kaže, da lahko ustvarimo datoteko JarResources objekt, inicializiran v datoteko JAR, ki vsebuje vir, ki ga želimo uporabiti - Images.jar. Nato uporabimo JarResources 'getResource () metoda za zagotavljanje surovih podatkov iz datoteke logo.gif za orodja AWT createImage () metoda.

Opomba o poimenovanju

JarResource je dokaj enostaven primer, kako uporabiti različne pripomočke, ki jih ponuja Java 1.1, za manipulacijo datotek JAR in arhiviranja zip.

Kratka opomba o poimenovanju. Podpora za arhiviranje v Javi se je pravzaprav začela s priljubljeno obliko arhiviranja zip (oglejte si "Nasvet Java 21: Uporabite arhivske datoteke za pospešitev nalaganja programčka"). Torej, prvotno so bili pri uvajanju podpore za Java za manipulacijo z arhivskimi datotekami vsi razredi in kaj drugega nameščeni v paketu java.util.zip; ti razredi se običajno začnejo z "Zadrga. "Toda nekje pri prehodu na Javo 1.1 so pooblastila, ki se spremenijo v ime arhiva, bolj osredotočena na Javo. Zato tisto, kar danes imenujemo datoteke JAR, v bistvu predstavljajo datoteke zip.

Kako deluje

Pomembna podatkovna polja za JarResources class se uporabljajo za sledenje in shranjevanje vsebine določene datoteke JAR:

javni končni razred JarResources {public boolean debugOn = false; private Hashtable htSizes = new Hashtable (); private Hashtable htJarContents = new Hashtable (); private String jarFileName; 

Primer instancije razreda nastavi ime datoteke JAR in nato pokliče na v() metoda za resnično delo:

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

Zdaj pa v() metoda v veliki meri samo naloži celotno vsebino določene datoteke JAR v razpršilno tablico (dostopna prek imena vira).

To je precej zajetna metoda, zato jo razčlenimo še malo naprej. The ZipFile razred nam daje osnovni dostop do informacij o glavi glave arhiva JAR / zip. To je podobno informacijam o imeniku v datotečnem sistemu. Tu naštejemo vse vnose v ZipFile in zgraditi htSizes hashtable z velikostjo vsakega vira v arhivu:

 private void init () {try {ZipFile zf = new ZipFile (jarFileName); Število e = zf.entries (); while (e.hasMoreElements ()) {ZipEntry ze = (ZipEntry) e.nextElement (); if (debugOn) {System.out.println (dumpZipEntry (ze)); } htSizes.put (ze.getName (), novo celo število ((int) ze.getSize ())); } zf.close (); 

Nato dostopamo do arhiva z uporabo ZipInputStream razred. The ZipInputStream class naredi vse čarovnije, da nam omogoči branje vsakega posameznega vira v arhivu. Natančno število bajtov preberemo iz arhiva, ki zajema vsak vir, in shranimo te podatke v htJarContents hashtable, dostopen po imenu vira:

 FileInputStream fis = novo FileInputStream (jarFileName); BufferedInputStream bis = novo BufferedInputStream (fis); ZipInputStream zis = nov ZipInputStream (bis); ZipEntry ze = null; medtem ko ((ze = zis.getNextEntry ())! = null) {if (ze.isDirectory ()) {nadaljevanje; } if (debugOn) {System.out.println ("ze.getName () =" + ze.getName () + "," + "getSize () =" + ze.getSize ()); } int velikost = (int) ze.getSize (); // -1 pomeni neznano velikost. if (size == - 1) {size = ((Integer) htSizes.get (ze.getName ())). intValue (); } bajt [] b = nov bajt [(int) velikost]; int rb = 0; int kos = 0; while ((((int) size - rb)> 0) {chunk = zis.read (b, rb, (int) size - rb); if (kos == - 1) {odmor; } rb + = kos; } // dodaj v razpršilno datoteko internega vira 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 ("done."); } catch (FileNotFoundException e) {e.printStackTrace (); } catch (IOException e) {e.printStackTrace (); }} 

Upoštevajte, da je ime, uporabljeno za identifikacijo vsakega vira, kvalificirano ime poti do vira v arhivu, nena primer ime razreda v paketu - to je ZipEntry razred iz paketa java.util.zip bi bil poimenovan "java / util / zip / ZipEntry," namesto "java.util.zip.ZipEntry."

Zadnji pomemben del kode je preprost testni gonilnik. Preizkusni gonilnik je preprosta aplikacija, ki zajema ime arhiva JAR / zip in ime vira. Vir poskuša najti v arhivu in poroča o njegovem uspehu ali neuspehu:

 public static void main (String [] args) vrže IOException {if (args.length! = 2) {System.err.println ("uporaba: java JarResources"); System.exit (1); } JarResources jr = novi JarResources (argumenti [0]); bajt [] buff = jr.getResource (args [1]); if (buff == null) {System.out.println ("Ne najdem" + args [1] + "."); } else {System.out.println ("Najdeno" + args [1] + "(length =" + buff.length + ")."); }}} // Konec razreda JarResources. 

In tam imate. Preprost razred, ki skriva vso neurejenost pri uporabi virov, zataknjenih v datoteke JAR.

Vaje za bralca

Zdaj, ko imate občutek za pridobivanje virov iz arhivske datoteke, je tu nekaj navodil, ki jih boste morda želeli raziskati pri spreminjanju in razširjanju datoteke JarResources razred:

  • Namesto da med gradnjo naložite vse, naredite naknadno nakladanje. V primeru velike datoteke JAR med gradnjo morda ni dovolj pomnilnika za nalaganje vseh datotek.
  • Namesto da preprosto ponudimo generično metodo dostopa, kot je getResource (), lahko ponudimo druge dostopne vire, na primer getImage (), ki vrne Javo Slika predmet, getClass (), ki vrne Javo Razred objekt (s pomočjo nalagalnika razredov po meri) itd. Če je datoteka JAR dovolj majhna, lahko vnaprej sestavimo vse vire glede na njihove končnice (.gif, .class itd.).
  • Nekatere metode bi morale zagotoviti informacije o sami datoteki JAR (v bistvu ovoj okoli ZipFile), vključno s: številom vnosov Jar / zip; števec, ki vrne vsa imena virov; dostopniki, ki vrnejo dolžino (in druge atribute) določenega vnosa; in dodatek, ki omogoča indeksiranje.
  • JarResources se lahko razširi za uporabo z apleti. Z uporabo parametrov programčka in URLConnection razreda lahko vsebino JAR prenesete iz omrežja, namesto da bi arhive odpirali kot lokalne datoteke. Poleg tega lahko ta razred razširimo kot prilagojevalnik vsebine Java.

Zaključek

Če ste že želeli vedeti, kako izvleči sliko iz datoteke JAR, imate zdaj način. Ne samo, da lahko slike obdelujete z datoteko JAR, ampak z novim razredom, ki je na voljo v tem nasvetu, s svojo čarobno ekstrakcijo delate kaj vir iz JAR.

Arthur Choi trenutno dela za IBM kot svetovalni programer. Delal je v več podjetjih, vključno s SamSung Network Laboratory in MITER. Različni projekti, pri katerih je delal, so odjemalsko-strežniški sistemi, računalništvo porazdeljenih predmetov in upravljanje omrežja. V različnih okoljih operacijskega sistema je uporabljal številne jezike. Programirati je začel leta 1981 s skupinama FORTRAN IV in COBOL. Kasneje je prešel na C in C ++, z Javo pa dela približno dve leti. Najbolj ga zanimajo aplikacije Java na področjih skladišč podatkov prek širokopasovnih omrežij ter vzporedna in porazdeljena obdelava prek interneta (z uporabo programiranja na osnovi agentov). John Mitchell, zaposleni, svetovalec in direktor lastnega podjetja, je zadnjih deset let vlagal v razvoj vrhunske računalniške programske opreme ter v svetovanje in usposabljanje drugih razvijalcev. Svetoval je o tehnologiji Java, prevajalnikih, tolmačih, spletnih aplikacijah in internetnem poslovanju. John je bil soavtor knjige Making Sense of Java: A Guide for Managers and Rest of Us in objavljal članke v programskih revijah. Poleg tega, da piše stolpec Java Tips za JavaWorld, moderira novičarski skupini comp.lang.tcl.announce in comp.binaries.geos.

Preberite več o tej temi

  • Tu je datoteka predavanja JarResources.java //www.javaworld.com/javatips/javatip49/JarResources.java
  • JAR-ji //www.javasoft.com/products/jdk/1.1/docs/guide/jar/index.html
  • Za več informacij o podpori za arhiviranje v Javi glejte "Nasvet Java 21Uporabite arhivske datoteke za pospešitev nalaganja programčka" //www.javaworld.com/javatips/jw-javatip21.html

To zgodbo, "Nasvet Java 49: Kako izvleči vire Java iz arhivov JAR in zip", je prvotno objavil JavaWorld.

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