12.07.2015 Views

Untitled - Vitajte na stránkach www.einsty.hostujem.sk

Untitled - Vitajte na stránkach www.einsty.hostujem.sk

Untitled - Vitajte na stránkach www.einsty.hostujem.sk

SHOW MORE
SHOW LESS
  • No tags were found...

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

P R O G R A M U J E M EJava pod lupou14. èas : Balíky java.util.* a java.netOpis balíka java.util by nebol úplný, keby sme vynechali jeho dva podbalíkyjava.util.zip a java.util.jar. Tretím balíkom, ktorému sa v tomto èísle pozrieme<strong>na</strong> zúbky, je java.net.BALÍK JAVA.UTIL.ZIP. Tento balík v zhode so svojím názvom obsahuje triedypre èítanie a zápis štandardných súborov ZIP a GZIP, triedy pre kompresiu a dekompresiudát pomocou algoritmu DEFLATE (použitého v súboroch ZIP a GZIP) a <strong>na</strong>koniec triedypre výpoèet kontrolného súètu pod¾a algoritmov CRC-32 a Adler-32 (špecifikácie formátova algoritmov možno nájs v dokumentoch RFC 1950–1952).Zaèneme od konca. Triedy Adler32 a CRC32 slúžia <strong>na</strong> výpoèet kontrolného súètupostupnosti bajtov. Práca s nimi spoèíva v opakovanom volaní metódy update(), ktorejargumentom je bajt alebo pole bajtov. Po odoslaní všetkých bajtov postupnosti zí<strong>sk</strong>amekontrolný súèet metódou getValue(). Tretia metóda reset() kontrolný súèet „reštartuje“<strong>na</strong> úvodnú hodnotu a dovo¾uje tak opätovne použi existujúcu inštanciu triedy.Schéma použitia oboch tried vyzerá približne takto:CRC32 crc = new CRC32();while ( ... ){byte b = ... ;crc.update(b);}long chksum = crc.getValue();Triedy implementujú rozhranie Checksum, ktoré obsahuje všetky uvedené metódy.Dve ïalšie triedy CheckedInputStream a CheckedOutputStream predstavujúvstupný, resp. výstupný prúd s pridanou schopnos ou poèíta kontrolný súèet dát, ktoréním prechádzajú. Obe triedy sú odvodené od „filtraèných“ tried FilterInputStream aFilterOutputStream (pozri predminulú èas seriálu) a <strong>na</strong>vyše obsahujú metódugetChecksum(), ktorá vracia aktuálnu hodnotu kontrolného súètu.Kompresiu dát použitím populárnej knižnice ZLIB zabezpeèuje trieda Deflater.Metódami setDictio<strong>na</strong>ry(), setStrategy() a setLevel() môžeme <strong>na</strong>stavipoèiatoèný slovník, komprimaènú stratégiu a úroveò kompresie (trieda Deflater obsahujenieko¾ko preddefinovaných úrovní vo forme statických konštánt). Údaje, ktoré chcemekomprimova , posielame triede pomocou metódy setInput(), <strong>sk</strong>omprimovanéúdaje zí<strong>sk</strong>ame volaním metódy deflate(). Pomocou metódy needsInput() zistíme, èitreba doda ïalšie vstupné údaje, metódou finish() oznámime triede, že už staèilo,ïalšie údaje jej nedodáme, a aby kompresiu vhodne ukonèila. Tento stav indikuje metódafinished() vrátením hodnoty true. Vïaka metódam getTotalIn(), getTotalOut()a getAdler() máme k dispozícii celkový poèet bajtov, ktoré „pretiekli“ triedou,a ich kontrolný súèet (Adler-32). Koneène metódy reset() a end() slúžia <strong>na</strong> reinicializáciu,resp. ukonèenie práce s triedou Deflater.Opaènú operáciu, dekompresiu dát, má <strong>na</strong> starosti trieda Inflater. Aj tu vstupnéúdaje zadávame pomocou metódy setInput(), ich dekomprimovanú podobu zí<strong>sk</strong>amevolaním metódy inflate(). Na zadanie poèiatoèného slovníka použijeme metódusetDictio<strong>na</strong>ry() (èi je to nevyhnutné, zistíme metódou needsDictio<strong>na</strong>ry()).Metódy needsInput(), finished(), getTotalIn(), getTotalOut(), getAdler(),reset() a end() majú rov<strong>na</strong>ký výz<strong>na</strong>m ako pri predošlej triede. Èi vo vstupnombufferi po dekompresii zostali nejaké nespracované dáta, zistíme pomocou metódygetRemaining().Triedu Deflater použijeme obyèajne takýmto spôsobom:Deflater dft = new Deflater();byte[] data = new byte[...];byte[] cdata = new byte[...];...dft.setInput(data);dft.finish();dft.deflate(cdata);a triedu Inflater zase takto:Inflater ift = new Inflater();ift.setInput(cdata);ift.inflate(data);Triedy Deflater a Inflater sú vhodne <strong>sk</strong>ombinované so vstupnými/výstupnýmiprúdmi v triedach DeflaterOutputStream a InflaterInputStream (opä sú to „filtraèné“triedy). Prvá z oboch tried disponuje schopnos ou priebežne komprimova údajezapisované pomocou štandardnej metódy write(), druhá, <strong>na</strong>opak, dokáže dekomprimovaúdaje èítané pomocou metódy read(). Na detekciu konca vstupného prúduInflaterInputStream použijeme metódu available().Štvorica tried ZipEntry, ZipFile, ZipOutputStream a ZipInputStream z<strong>na</strong>ènýmspôsobom u¾ahèuje prácu so súbormi ZIP. ZipEntry reprezentuje jednu položkusúboru ZIP (t. j. jeden zo súborov v archíve). Každá položka má svoje meno, ktoré sazadáva ako argument konštruktora a zisti ho možno pomocou metódy getName().Ïalšie metódy triedy ZipEntry slúžia <strong>na</strong> <strong>na</strong>stavenie/sprístupnenie rôznych atribútovpoložky: setTime(), setSize(), setCompressedSize(), setCrc(), setMethod(),setExtra(), setComment() a ich get***() ekvivalenty – názvy metód sú dostatoèneopisné. Pomocou metódy isDirectory() zistíme, èi je daná položka adresárom(názvy adresárov sa konèia z<strong>na</strong>kom /).Ïalšia trieda ZipFile slúži <strong>na</strong> èítanie položiek zo súboru ZIP. Argumentom jej konštruktoraje re azec s cestou k súboru alebo objekt triedy File. Cestu k súboru môžemespolu s menom zisti dodatoène volaním metódy getName(). Metóda size() vraciapoèet položiek v súbore, metóda entries() vracia položky ako enumeráciu (typ Enumeration).Pomocou getEntry() sa dostaneme k vybranej položke a pomocougetInputStream() zí<strong>sk</strong>ame vstupný prúd, ktorý možno použi <strong>na</strong> èítanie údajov zpoložky. Metóda close() otvorený súbor korektne uzavrie.Trieda ZipOutputStream je potomkom DeflatedOutputStream a predstavujevýstupný prúdový filter <strong>na</strong> zápis do súborov ZIP. Komprimaènú metódu, úroveò kompresiea prípadný komentár môžeme špecifikova pomocou metód setMethod(), setLevel()a setComment(). Novú položku v súbore ZIP zaèneme metódou putNextEntry().Zápis sa realizuje klasickou metódou write(), položku uzavrieme volaním metódycloseEntry(). Súbor (a prúd) uzavrieme metódou close().Komplementár<strong>na</strong> trieda ZipInputStream slúži ako vstupný filter <strong>na</strong> èítanie zo súborovZIP. Je potomkom triedy InflaterInputStream a pracuje sa s òou podobne ako spredchádzajúcou triedou: <strong>na</strong>sledujúcu položku „zaèneme“ volaním getNextEntry(),èítanie obsahu položky obstará metóda read() a položku <strong>na</strong>koniec uzavrieme metódoucloseEntry(). Metóda createZipEntry() slúži <strong>na</strong> vytvorenie objektu ZipEntry prepoložku so zadaným menom.Posledné dve triedy, GZIPOutputStream a GZIPInputStream, predstavujú prúdovéfiltre pre zápis a èítanie do/z GZIP súborov. Tie nemajú žiadnu vnútornú štruktúru(preto sa v UNIX-like operaèných systémoch musí použi <strong>na</strong>jprv TAR archivátor), takže súpredefinované len metódy read() a write() (triedy sú odvodené od DeflaterOutputStreama InflaterInputStream).Balík java.util.zip obsahuje aj dve triedy výnimiek: DataFormatException,ktorá sig<strong>na</strong>lizuje chybu formátu údajov pri ich rozba¾ovaní, a ZipException, ktorá indikujechybu pri práci so súborom ZIP.BALÍK JAVA.UTIL.JAR. Druhý podbalík po<strong>sk</strong>ytuje triedy pre prácu so súbormiJAR (= Java ARchive), ktoré sú založené <strong>na</strong> štandardnom formáte ZIP a <strong>na</strong>vyše volite¾neobsahujú tzv. manifestaèný súbor (manifest file, ïalej len „manifest“). Tento súbor obsahujemetainformácie o obsahu súboru JAR vo forme položiek a k nim priradených množí<strong>na</strong>tribútov (pod atribútom treba rozumie dvojicu k¾úè–hodnota).Upozornenie: <strong>na</strong>sledujúce riadky budú èitate¾ovi omnoho jasnejšie po preštudovanídokumentácie k JDK, kde sa <strong>na</strong>chádza opis súborov JAR i manifestu.Prvou z tried balíka java.util.jar je Attributes, ktorá funguje podobne ako mapovacietriedy balíka java.util – mapuje názvy atribútov <strong>na</strong> re azcové hodnoty pridružené knim (trieda Attributes v <strong>sk</strong>utoènosti implementuje rozhranie java.util.Map). Hodnotuvybraného atribútu zistíme pomocou metódy getValue(). Meno atribútu môžeme zadaako re azec alebo ako objekt typu Attributes.Name, èo je pomocná trieda <strong>na</strong> reprezentáciunázvov atribútov s množstvom preddefinovaných statických konštánt (bližšie pozri dokumentáciuk JDK). Opaènú operáciu – <strong>na</strong>stavenie hodnoty atribútu – realizuje metóda putValue().Ostatné metódy boli opísané v predchádzajúcej èasti.Samotný manifest reprezentuje trieda Manifest. Pomocou metódy getMainAttributes()zí<strong>sk</strong>ame tzv. hlavné atribúty manifestu (týkajú sa celého manifestu) a pomocougetAttributes() sa dostaneme k atribútom jednotlivých položiek. Zoz<strong>na</strong>m položiek(objekt typu Map) zí<strong>sk</strong>ame volaním metódy getEntries(). Metóda clear() zruší celýobsah manifestu, metódy read() a write() slúžia <strong>na</strong> <strong>na</strong>èítanie/zápis obsahu manifestuz/do zadaného prúdu.Nasledujúce štyri triedy – JarEntry, JarFile, JarOutputStream a JarInput-Stream – sú výz<strong>na</strong>mom prakticky totožné so svojimi náprotivkami v balíkujava.util.zip (ba èo viac, sú ich potomkami). Trieda JarEntry reprezentuje položkusúboru JAR (pozor, nie položku manifestu!) a obsahuje <strong>na</strong>vyše metódu getAttributes(),ktorá vracia atribúty danej položky, a getCertificates() – tá vracia digitálnecertifikáty položky.Trieda JarFile slúži <strong>na</strong> èítanie obsahu súboru JAR. Je možné prikáza , aby sa pri otváranísúboru <strong>sk</strong>ontroloval jeho digitálny podpis. Medzi pridanými metódami nájdemegetManifest() <strong>na</strong> prístup k manifestu súboru JAR a getJarEntry() <strong>na</strong> sprístupneniezadanej položky súboru.Triedy JarOutputStream a JarInputStream celkom logicky slúžia ako prúdové filtre <strong>na</strong>zápis/èítanie súborov JAR. V prvej triede, JarOutputStream, nenájdeme niè nové, len predefinovanúmetódu putNextEntry(). Druhá trieda, JarInputStream, obsahuje dve novémetódy: getManifest() a getNextJarEntry(). Ich výz<strong>na</strong>m je zrejmý.V balíku java.util.jar nájdeme jednu výnimku, JarException, odvodenú odZipException a indikujúcu problémy pri èítaní alebo zápise súboru JAR.BALÍK JAVA.NET. Z názvu tohto balíka je <strong>na</strong> prvý poh¾ad jasné, že bude obsahovatriedy pre podporu sie ových aplikácií. Komunikácia sa realizuje prostredníctvom soke-126 PC REVUE 10/2001

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!