Programavimas

„Java“ patarimas 49: Kaip išgauti „Java“ išteklius iš JAR ir zip archyvų

Daugeliui „Java“ programuotojų yra gana aiškūs JAR failo naudojimo visų įvairių išteklių (tai yra .class failų, garsų ir vaizdų), kurie sudaro jų „Java“ sprendimą, rinkinio privalumai. (Jei nesate susipažinę su JAR failais, peržiūrėkite toliau pateiktą skyrių „Ištekliai“.) Labai dažnas klausimas, kurį užduoda žmonės, kurie tik pradeda įtraukti JAR failus į savo triukų krepšį, yra „Kaip išgauti vaizdą iš JAR? " Mes atsakysime į šį klausimą ir pateiksime klasę, kad būtų labai paprasta išgauti bet kokius iš JAR šaltinius!

Įkeliamas GIF vaizdas

Tarkime, kad turime JAR failą, kuriame yra krūva .gif vaizdo failų, kuriuos norime naudoti savo programoje. Štai kaip mes galime pasiekti paveikslėlio failą iš JAR naudodami „JarResources“:

 JarResources jar = new JarResources ("Images.jar"); Vaizdo logotipas = Toolkit.getDefaultToolkit (). CreateImage (jar.getResource ("logo.gif"); 

Tas kodo fragmentas rodo, kad galime sukurti „JarResources“ objektas inicializuotas JAR faile, kuriame yra šaltinis, kurį mes norime naudoti - Vaizdai.jar. Tada mes naudojame „JarResources“getResource () metodas pateikti neapdorotus duomenis iš „logo.gif“ failo AWT įrankių rinkiniui createImage () metodas.

Pastaba dėl vardų suteikimo

„JarResource“ yra gana paprastas pavyzdys, kaip naudotis įvairiomis „Java 1.1“ teikiamomis galimybėmis manipuliuoti JAR ir zip archyvo failais.

Greita pastaba apie vardų suteikimą. Archyvavimo palaikymas „Java“ faktiškai prasidėjo naudojant populiarų „zip“ archyvavimo formatą (žr. „Java Patarimas 21: Naudokite archyvinius failus, kad paspartintumėte programėlių įkėlimą“). Iš pradžių, įgyvendinant „Java“ palaikymą, kad būtų galima manipuliuoti archyvo failais, visos klasės ir dar ne viskas buvo įdėta į java.util.zip paketą; šios klasės paprastai prasideda „Pašto kodas". Bet kur nors pereinant prie„ Java 1.1 “galios, kurios turi pakeisti archyvo pavadinimą, kad būtų labiau sutelktos į„ Java “. Taigi, tai, ką dabar vadiname JAR failais, iš esmės yra ZIP failai.

Kaip tai veikia

Svarbūs duomenų laukai „JarResources“ klasės yra naudojamos sekti ir saugoti nurodyto JAR failo turinį:

public final class JarResources {public boolean debugOn = false; privatus „Hashtable“ htSizes = naujas „Hashtable“ (); privatus „Hashtable“ htJarContents = naujas „Hashtable“ (); privati ​​eilutė jarFileName; 

Taigi, klasės egzempliorius nustato JAR failo pavadinimą ir paskambina į inicijuoti () metodas atlikti visą realų darbą:

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

Dabar inicijuoti () metodas beveik įkelia visą nurodyto JAR failo turinį į hashtable (prieinamą naudojant ištekliaus pavadinimą).

Tai gana nemažas metodas, todėl suskirstykime jį šiek tiek toliau. „ZipFile“ klasė suteikia mums pagrindinę prieigą prie JAR / zip archyvo antraštės informacijos. Tai panašu į katalogų informaciją failų sistemoje. Čia išvardijame visus įrašus „ZipFile“ ir pastatykite htDydžiai „hashtable“ su kiekvieno archyvo ištekliaus dydžiu:

 private void init () {try {ZipFile zf = new ZipFile (jarFileName); Surašymas e = zf.entries (); while (e.hasMoreElements ()) {ZipEntry ze = (ZipEntry) e.nextElement (); if (debugOn) {System.out.println (dumpZipEntry (ze)); } htSizes.put (ze.getName (), naujas sveikasis skaičius ((int) ze.getSize ())); } zf.close (); 

Tada mes prieiname prie archyvo naudodami „ZipInputStream“ klasė. „ZipInputStream“ klasė daro viską, kad leistų mums perskaityti kiekvieną atskirą archyvo šaltinį. Iš archyvo perskaitėme tikslų baitų, sudarančių kiekvieną išteklių, skaičių ir tuos duomenis saugome htJarContents „hashtable“ prieinama pagal išteklių pavadinimą:

 FileInputStream fis = nauja FileInputStream (jarFileName); „BufferedInputStream bis“ = naujas „BufferedInputStream“ (fis); ZipInputStream zis = naujas ZipInputStream (bis); ZipEntry ze = nulis; while ((ze = zis.getNextEntry ())! = null) {if (ze.isDirectory ()) {tęsti; } if (debugOn) {System.out.println ("ze.getName () =" + ze.getName () + "," + "getSize () =" + ze.getSize ()); } int dydis = (int) ze.getSize (); // -1 reiškia nežinomą dydį. if (dydis == - 1) {dydis = ((Sveikas skaičius) htSizes.get (ze.getName ())). intValue (); } baitas [] b = naujas baitas [(int) dydis]; int rb = 0; int gabalas = 0; o (((int) dydis - rb)> 0) {gabalas = zis.read (b, rb, (int) dydis - rb); if (gabalas == - 1) {pertrauka; } rb + = gabalas; } // pridėti prie vidinių išteklių hashtable htJarContents.put (ze.getName (), b); if (debugOn) {System.out.println (ze.getName () + "rb =" + rb + ", size =" + size + ", csize =" + ze.getCompressedSize ()); }}} gaudyti (NullPointerException e) {System.out.println ("padaryta."); } gaudyti (FileNotFoundException e) {e.printStackTrace (); } gaudyti (IOException e) {e.printStackTrace (); }} 

Atkreipkite dėmesį, kad vardas, naudojamas kiekvienam šaltiniui identifikuoti, yra kvalifikuotas išteklių pavadinimas archyve, ne, pavyzdžiui, pakuotės klasės pavadinimas - tai yra „ZipEntry“ klasė iš paketo java.util.zip būtų pavadinta „java / util / zip / ZipEntry“, o ne „java.util.zip.ZipEntry“.

Paskutinė svarbi kodo dalis yra paprastas testo tvarkyklė. Testavimo tvarkyklė yra paprasta programa, turinti JAR / zip archyvo pavadinimą ir ištekliaus pavadinimą. Jis bando rasti išteklių archyve ir praneša apie jo sėkmę ar nesėkmę:

 public static void main (String [] args) meta IOException {if (args.length! = 2) {System.err.println ("naudojimas: java JarResources"); „System.exit“ (1); } JarResources jr = nauji JarResources (argumentai [0]); baitas [] buff = jr.getResource (argumentai [1]); if (buff == null) {System.out.println ("Nepavyko rasti" + args [1] + "."); } else {System.out.println ("Rasta" + args [1] + "(ilgis =" + buff.length + ")."); }}} // „JarResources“ klasės pabaiga. 

Ir jūs turite tai. Paprasta naudoti klasė, slepianti visas netvarkas, susijusias su išteklių, paslėptų JAR failuose, naudojimu.

Pratimai skaitytojui

Dabar, kai jaučiatės išgauti išteklius iš archyvo failo, pateikite keletą nurodymų, kuriuos galbūt norėsite ištirti keisdami ir išplėsdami „JarResources“ klasė:

  • Užuot viską kraunant statybų metu, atlikite uždelstą krovinį. Didelio JAR failo atveju gali nepakakti atminties, kad visi failai būtų įkelti statybos metu.
  • Užuot paprasčiausiai pateikęs bendrą prieigos metodą, pvz getResource (), galėtume suteikti kitų prieigų, susijusių su konkrečiais ištekliais, pavyzdžiui, „getImage“ (), kuris pateikia „Java“ Vaizdas objektas, „getClass“ (), kuris pateikia „Java“ Klasė objektas (su pritaikyto klasės krautuvo pagalba) ir pan. Jei JAR failas yra pakankamai mažas, galėtume iš anksto sukurti visus išteklius pagal jų plėtinius (.gif, .class ir pan.).
  • Kai kurie metodai turėtų suteikti informacijos apie pačią pateiktą JAR failą (iš esmės paketą aplink „ZipFile“), įskaitant: „Jar / zip“ įrašų skaičių; surašytojas, kuris grąžina visus išteklių pavadinimus; prieigos elementai, kurie pateikia konkretaus įrašo ilgį (ir kitus atributus); ir prieigą, leidžiantį indeksuoti.
  • „JarResources“ gali būti išplėstas, kad būtų galima naudoti programėlėms. Naudojant programėlių parametrus ir URLConnection klasės, JAR turinį galima atsisiųsti iš tinklo, užuot atidarius archyvus kaip vietinius failus. Be to, galime išplėsti šią klasę kaip pasirinktinį „Java“ turinio tvarkytuvą.

Išvada

Jei labai norėjote sužinoti, kaip išgauti vaizdą iš JAR failo, dabar jūs turite kelią. Galite ne tik tvarkyti atvaizdus naudodami JAR failą, bet ir naudodami naują šiame patarime pateiktą klasę, dirbate savo ištraukimo magija bet koks JAR šaltinis.

Šiuo metu Arthuras Choi dirba IBM kaip patarėjas programuotojas. Jis dirbo keliose įmonėse, įskaitant „SamSung Network Laboratory“ ir „MITER“. Įvairūs projektai, kuriuos jis dirbo, yra kliento / serverio sistemos, paskirstytas objektų skaičiavimas ir tinklo valdymas. Jis vartojo daug kalbų įvairiose operacinių sistemų aplinkose. Programuoti jis pradėjo 1981 m. Kartu su „FORTRAN IV“ ir „COBOL“. Vėliau jis perėjo prie „C“ ir „C ++“, o su „Java“ dirba maždaug dvejus metus. Jį labiausiai domina „Java“ programos duomenų saugyklose per plataus tinklo tinklus ir lygiagretus bei paskirstytas apdorojimas internetu (naudojant agentų programavimą). John Mitchell, savo įmonės darbuotojas, konsultantas ir direktorius, pastaruosius dešimt metų investavo į pažangiausios kompiuterių programinės įrangos kūrimą ir kitų kūrėjų konsultavimą bei mokymą. Jis konsultavo „Java“ technologijas, kompiliatorius, vertėjus žodžiu, žiniatinklio programas ir internetinę komerciją. Johnas yra knygos „Making Sense of Java: a Guide for Managers and the Us of Us“ vadovas ir paskelbė straipsnius programavimo žurnaluose. Be to, kad rašo „JavaWorld“ stulpelį „Java Tips“, jis prižiūri naujienų grupes comp.lang.tcl.announce ir comp.binaries.geos.

Sužinokite daugiau apie šią temą

  • Čia yra klasės failas JarResources.java //www.javaworld.com/javatips/javatip49/JarResources.java
  • JAR //www.javasoft.com/products/jdk/1.1/docs/guide/jar/index.html
  • Norėdami daugiau sužinoti apie palaikymą „Java“, žr. „Java Tip 21“. Naudokite archyvinius failus, kad paspartintumėte programėlių įkelimą “//www.javaworld.com/javatips/jw-javatip21.html

Šią istoriją „Java Patarimas 49: Kaip išgauti Java išteklius iš JAR ir ZIP archyvų“ iš pradžių paskelbė „JavaWorld“.