Programmēšana

Java padoms 49: Kā iegūt Java resursus no JAR un zip arhīviem

Lielākajai daļai Java programmētāju ir diezgan skaidras JAR faila izmantošanas priekšrocības, apvienojot visus dažādos resursus (tas ir, .class failus, skaņas un attēlus), kas ietver viņu Java risinājumu. (Ja jums nav zināmi JAR faili, skatiet tālāk esošo resursu sadaļu.) Ļoti bieži jautājums, ko uzdod cilvēki, kuri tikko sākuši iekļaut JAR failus savā triku maisiņā, ir šāds: "Kā es varu iegūt attēlu no JAR? " Mēs atbildēsim uz šo jautājumu un nodrošināsim klasi, lai būtu ļoti vienkārši iegūt jebkuru resursu no JAR!

Notiek GIF attēla ielāde

Pieņemsim, ka mums ir JAR fails, kurā ir virkne .gif attēlu failu, kurus mēs vēlamies izmantot mūsu lietojumprogrammā. Lūk, kā mēs varētu piekļūt attēla failam no JAR, izmantojot JarResources:

 JarResources jar = new JarResources ("Images.jar"); Attēla logotips = Toolkit.getDefaultToolkit (). CreateImage (jar.getResource ("logo.gif"); 

Šis koda fragments parāda, ka mēs varam izveidot JarResources objekts inicializēts JAR failā, kurā ir resurss, kuru mēs esam ieinteresēti izmantot - Attēli.jar. Pēc tam mēs izmantojam JarResources 'getResource () metode neapstrādātu datu nodrošināšanai no logotipa.gif faila AWT rīkkopa createImage () metodi.

Piezīme par nosaukšanu

JarResource ir diezgan vienkāršs piemērs tam, kā izmantot dažādas Java 1.1 sniegtās iespējas, lai manipulētu ar JAR un zip arhīva failiem.

Ātra piezīme par nosaukšanu. Arhivēšanas atbalsts Java faktiski sākās, izmantojot populāro zip arhivēšanas formātu (skatiet sadaļu "Java Tip 21: Izmantojiet arhīva failus, lai paātrinātu sīklietotņu ielādi"). Sākotnēji, ieviešot Java atbalstu, lai manipulētu arhīva failiem, visas klases un kas cits tika ievietoti java.util.zip paketē; šīs nodarbības parasti sākas ar "Zip. "Bet kaut kur, pārejot uz Java 1.1, pilnvaras, kas tiek mainītas arhīva nosaukumā, lai būtu vairāk vērstas uz Java. Tādējādi tas, ko mēs tagad saucam par JAR failiem, būtībā ir zip faili.

Kā tas strādā

Svarīgi datu lauki JarResources klases tiek izmantotas, lai izsekotu un saglabātu norādītā JAR faila saturu:

public final class JarResources {public boolean debugOn = false; privātais hashtable htSizes = jauns hashtable (); privāts Hashtable htJarContents = jauns Hashtable (); privāta virkne jarFileName; 

Tātad klases eksemplārs nosaka JAR faila nosaukumu un pēc tam izsauc tajā() metode visu reālo darbu veikšanai:

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

Tagad tajā() metode diezgan vienkārši ielādē visu norādītā JAR faila saturu hashtable (tam var piekļūt, izmantojot resursa nosaukumu).

Šī ir diezgan dūšīga metode, tāpēc sadalīsim to nedaudz tālāk. The ZipFile klase dod mums pamata piekļuvi JAR / zip arhīva galvenes informācijai. Tas ir līdzīgs direktoriju informācijai failu sistēmā. Šeit mēs uzskaitām visus ierakstus ZipFile un izveidojiet htIzmēri hashtable ar katra arhīva resursa lielumu:

 private void init () {mēģiniet {ZipFile zf = jauns ZipFile (jarFileName); Uzskaitījums e = zf.entries (); while (e.hasMoreElements ()) {ZipEntry ze = (ZipEntry) e.nextElement (); if (debugOn) {System.out.println (dumpZipEntry (ze)); } htSizes.put (ze.getName (), jauns Integer ((int) ze.getSize ())); } zf.close (); 

Pēc tam mēs piekļūstam arhīvam, izmantojot ZipInputStream klasē. The ZipInputStream klase dara visu burvju, lai ļautu mums izlasīt katru atsevišķo resursu arhīvā. Mēs arhīvā nolasījām precīzu baitu skaitu, kas satur katru resursu, un glabājam šos datus htJarContents hashtable, kas pieejams pēc resursa nosaukuma:

 FileInputStream fis = jauns FileInputStream (jarFileName); BufferedInputStream bis = jauns BufferedInputStream (fis); ZipInputStream zis = jauns ZipInputStream (bis); ZipEntry ze = nulle; while ((ze = zis.getNextEntry ())! = null) {if (ze.isDirectory ()) {turpināt; } if (atkļūdošana) {System.out.println ("ze.getName () =" + ze.getName () + "," + "getSize () =" + ze.getSize ()); } int izmērs = (int) ze.getSize (); // -1 nozīmē nezināmu izmēru. if (size == - 1) {size = ((Integer) htSizes.get (ze.getName ())). intValue (); } baits [] b = jauns baits [(int) lielums]; int rb = 0; int gabals = 0; kamēr (((int) izmērs - rb)> 0) {gabals = zis.lasīt (b, rb, (int) izmērs - rb); ja (gabals == - 1) {pārtraukums; } rb + = gabals; } // pievienot iekšējam resursam hashtable htJarContents.put (ze.getName (), b); if (atkļūdošana) {System.out.println (ze.getName () + "rb =" + rb + ", size =" + size + ", csize =" + ze.getCompressedSize ()); }}} catch (NullPointerException e) {System.out.println ("izdarīts."); } catch (FileNotFoundException e) {e.printStackTrace (); } catch (IOException e) {e.printStackTrace (); }} 

Ņemiet vērā, ka nosaukums, ko izmanto katra resursa identificēšanai, ir arhīvā esošā resursa kvalificētais ceļa nosaukums, , piemēram, klases nosaukums iepakojumā - tas ir, ZipEntry klase no paketes java.util.zip tiktu nosaukta par "java / util / zip / ZipEntry", nevis "java.util.zip.ZipEntry".

Pēdējā svarīgā koda daļa ir vienkāršs testa draiveris. Testa draiveris ir vienkārša lietojumprogramma, kurai nepieciešams JAR / zip arhīva nosaukums un resursa nosaukums. Tas mēģina atrast resursu arhīvā un ziņo par tā panākumiem vai neveiksmēm:

 public static void main (String [] args) met IOException {if (args.length! = 2) {System.err.println ("lietojums: java JarResources"); System.exit (1); } JarResources jr = jaunie JarResources (argumenti [0]); baits [] buff = jr.getResource (argumenti [1]); if (buff == null) {System.out.println ("Nevarēja atrast" + args [1] + "."); } else {System.out.println ("Atrasts" + args [1] + "(garums =" + buf.length + ")."); }}} // JarResources klases beigas. 

Un tur jums tas ir. Vienkārši lietojama klase, kas slēpj visu netīro, kas saistīts ar JAR failos ievietoto resursu izmantošanu.

Vingrinājumi lasītājam

Tagad, kad jūs jūtaties par resursu iegūšanu no arhīva faila, šeit ir daži norādījumi, kurus varat izpētīt, modificējot un paplašinot JarResources klase:

  • Tā vietā, lai visu iekrautu būvniecības laikā, veiciet aizkavētu iekraušanu. Liela JAR faila gadījumā, iespējams, nepietiek atmiņas, lai būvniecības laikā varētu ielādēt visus failus.
  • Tā vietā, lai vienkārši nodrošinātu vispārīgu piekļuves metodi, piemēram, getResource (), mēs varētu nodrošināt citus piekļuves resursus, piemēram, getImage (), kas atgriež Java Attēls objekts, getClass (), kas atgriež Java Klase objekts (ar pielāgota klases iekrāvēja palīdzību) utt. Ja JAR fails ir pietiekami mazs, mēs visus resursus varētu iepriekš izveidot, pamatojoties uz to paplašinājumiem (.gif, .class un tā tālāk).
  • Dažām metodēm būtu jāsniedz informācija par pašu JAR failu (būtībā iesaiņojums ap ZipFile), ieskaitot: Jar / zip ierakstu skaitu; skaitītājs, kas atgriež visus resursu nosaukumus; piekļuvēji, kas atgriež konkrētā ieraksta garumu (un citus atribūtus); un piekļuvēju, kas ļauj indeksēt, nosaucot dažus.
  • JarResources var paplašināt, lai tos izmantotu sīklietotnes. Izmantojot sīklietotnes parametrus un URLConnection klasē, JAR saturu var lejupielādēt no tīkla, nevis atvērt arhīvus kā vietējos failus. Turklāt mēs varam paplašināt šo klasi kā pielāgotu Java satura apstrādātāju.

Secinājums

Ja esat ļoti vēlējies zināt, kā iegūt attēlu no JAR faila, tagad jums ir veids, kā to izdarīt. Jūs varat ne tikai apstrādāt attēlus ar JAR failu, bet ar jauno klasi, kas sniegta šajā padomā, jūs strādājat ar savu burvju jebkurš resurss no JAR.

Pašlaik Artūrs Čoi strādā IBM kā padomdevējs programmētājs. Viņš ir strādājis vairākos uzņēmumos, tostarp SamSung tīkla laboratorijā un MITER. Dažādi projekti, ar kuriem viņš ir strādājis, ir klienta / servera sistēmas, sadalītā objekta skaitļošana un tīkla pārvaldība. Viņš ir izmantojis vairākas valodas dažādās operētājsistēmu vidēs. Viņš sāka programmēt 1981. gadā ar FORTRAN IV un COBOL. Vēlāk viņš pārgāja uz C un C ++, un viņš strādā ar Java apmēram divus gadus. Viņu visvairāk interesē Java lietojumprogrammas datu krātuvēs, izmantojot plaša tīkla tīklus, un paralēla un izplatīta apstrāde, izmantojot internetu (izmantojot aģentu programmēšanu). Džons Mičels, sava uzņēmuma darbinieks, konsultants un direktors, pēdējos desmit gadus ir ieguldījis progresīvas datoru programmatūras izstrādē, kā arī citu izstrādātāju konsultēšanā un apmācībā. Viņš ir sniedzis konsultācijas par Java tehnoloģijām, sastādītājiem, tulkotājiem, tīmekļa lietojumprogrammām un interneta tirdzniecību. Džons ir līdzautors “Making Sense of Java: A Guide for Managers and Rest of Us” un ir publicējis rakstus programmēšanas žurnālos. Papildus kolonnas Java Tips rakstīšanai JavaWorld viņš vada ziņu grupas comp.lang.tcl.announce un comp.binaries.geos.

Uzziniet vairāk par šo tēmu

  • Šeit ir klases fails JarResources.java //www.javaworld.com/javatips/javatip49/JarResources.java
  • JAR //www.javasoft.com/products/jdk/1.1/docs/guide/jar/index.html
  • Plašāku informāciju par Java arhivēšanas atbalstu skatiet sadaļā "Java Padoms 21: Izmantojiet arhīva failus, lai paātrinātu sīklietotņu ielādi" //www.javaworld.com/javatips/jw-javatip21.html

Šo stāstu "Java Padoms 49: Kā iegūt Java resursus no JAR un zip arhīviem" sākotnēji publicēja JavaWorld.

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