´ r Java Seminaˇ ´ ı XML Proudy, Zpracovan´
Radek Koˇc´ı Fakulta informaˇcn´ıch technologi´ı VUT
Bˇrezen 2008
Radek Koˇc´ı
´ ı XML ´ r Java – Proudy, Zpracovan´ Seminaˇ
1/ 38
Obsah Vstup/V´ystup koncepce proudu˚ ´ re soubory, adresaˇ ´ ı proudy (tˇr´ıdy InputStream, OutputStream) binarn´ znakove´ proudy (tˇr´ıdy Reader, Writer) filtrovane´ proudy standardn´ı vstup a v´ystup
Komprimace Serializace ´ ı XML dokument˚u Zpracovan´
Radek Koˇc´ı
´ ı XML ´ r Java – Proudy, Zpracovan´ Seminaˇ
2/ 38
Koncepce i/o operac´ı Bal´ıcˇ ky ´ ´ s proudy java.io – zakladn´ ı knihovna pro praci java.nio – alternativn´ı knihovna od verze 1.4+ (new IO) I/O operace zaloˇzeny na i/o proudech transparentn´ı ´ platformoveˇ nezavisl e´ Datov´y proud libovoln´y datov´y zdroj cˇ i c´ıl schopn´y zpˇr´ıstupnit/pˇrijmout libovolne´ datove´ bloky ´ objektem – ukr´yvan´ ´ ı detailu˚ (skuteˇcne´ akce reprezentovan se skuteˇcn´ym i/o zaˇr´ızen´ım) Radek Koˇc´ı
´ ı XML ´ r Java – Proudy, Zpracovan´ Seminaˇ
3/ 38
Koncepce i/o operac´ı
Proudy jako stavebnice kaˇzda´ tˇr´ıda reprezentuje jeden typ proudu (definuje jeho vlastnosti – operace) ´ an´ ´ ım objekt˚u (proudu˚ ) nove´ vlastnosti se daj´ı z´ıskat vklad do sebe ... is = new InputStream(...); bis = new BufferedInputStream(is); ...
Radek Koˇc´ı
´ ı XML ´ r Java – Proudy, Zpracovan´ Seminaˇ
4/ 38
´ se soubory Prace Tˇr´ıda java.io.File ´ re, linky) na disku ”obaluje” fyzicke´ soubory (adresaˇ ´ u˚ soubor˚u (transparentn´ı odliˇsen´ı) speciality system char File.separatorChar – (′ /′ nebo ′ \′ ) String File.separator char File.pathSeparatorChar – (′ :′ nebo ′ ;′ ) String File.pathSeparator ´r System.getProperty("user.dir") – adresaˇ ˇ proces JVM uˇzivatele s jehoˇz UID byl spuˇsten
´ r) je reprezentovan ´ v objektu abstraktn´ım soubor (adresaˇ pathname ´ pˇri pˇr´ıstupu k zaˇr´ızen´ı se konvertuje na systemov eˇ zavisle´ ´ jmeno vytvoˇren´ım instance tˇr´ıdy File se k zaˇr´ızen´ı nepˇristupuje!
Radek Koˇc´ı
´ ı XML ´ r Java – Proudy, Zpracovan´ Seminaˇ
5/ 38
Tˇr´ıda File
Kostruktory File(String pathname) – vytvoˇr´ı instanci File ´ ım ˇretezce ˇ konvertovan´ pathname na abstraktn´ı pathname File(String parent, String child) – vytvoˇr´ı ˇ ˇ instanci File z ˇretezce parent a ˇretezce child File(File parent, String child) – vytvoˇr´ı instanci File z abstraktn´ıho pathname objektu parent ˇ pathname a ˇretezce child ´ ım File(URI uri) – vytvoˇr´ı instanci File konvertovan´ ´ file:URI na abstraktn´ı pathname daneho
Radek Koˇc´ı
´ ı XML ´ r Java – Proudy, Zpracovan´ Seminaˇ
6/ 38
Tˇr´ıda File
Testovac´ı operace boolean exists() boolean isFile() boolean isDirectory() boolean canRead() boolean canWrite() ...
Radek Koˇc´ı
´ ı XML ´ r Java – Proudy, Zpracovan´ Seminaˇ
7/ 38
Tˇr´ıda File
´ re) Vytvoˇren´ı souboru (adresaˇ ´ boolean createNewFile() – vytvoˇr´ı nov´y prazdn´ y soubor podle abstraktn´ıho pathname; vrac´ı true, pokud se oprace zdaˇr´ı ´r . . . boolean mkdir() – vytvoˇr´ı adresaˇ ´ r´ı i boolean mkdirs() – jako boolean mkdir(), vytvaˇ ´ rovou strukturu, pokud je potˇreba adresaˇ ...
Radek Koˇc´ı
´ ı XML ´ r Java – Proudy, Zpracovan´ Seminaˇ
8/ 38
Tˇr´ıda File
´ (temporary) souboru Vytvoˇren´ı doˇcasneho static File createTempFile(String prefix, String suffix) – vytvoˇr´ı doˇcasn´y soubor ve ´ ri standardn´ım adresaˇ static File createTempFile(String prefix, String suffix, File directory) – vytvoˇr´ı doˇcasn´y ´ adresaˇ ´ ri soubor v uvedenem
Radek Koˇc´ı
´ ı XML ´ r Java – Proudy, Zpracovan´ Seminaˇ
9/ 38
Tˇr´ıda File Dalˇs´ı vlastnosti boolean delete() boolean renameTo(File dest) long length() long lastModified() String getName() String getPath() String getAbsolutePath() String getParent() ... Vˇsechny vlastnosti a operace viz API documentation Radek Koˇc´ı
´ ı XML ´ r Java – Proudy, Zpracovan´ Seminaˇ
10/ 38
´ ´ s adresaˇ ´ ri – File Ukazka prace
String[] list() ˇ u˚ reprezentuj´ıc´ıch jmena ´ vrac´ı pole rˇetezc soubor˚u a ´ ru˚ v adresaˇ ´ ri danem ´ abstraktn´ım pathname adresaˇ String[] list(FilenameFilter filter) ˇ u˚ reprezentuj´ıc´ıch jmena ´ vrac´ı pole rˇetezc soubor˚u a ´ abstraktn´ım pathname, ktere´ ´ ri danem ´ ru˚ v adresaˇ adresaˇ odpov´ıdaj´ı filtru
Radek Koˇc´ı
´ ı XML ´ r Java – Proudy, Zpracovan´ Seminaˇ
11/ 38
´ ´ s adresaˇ ´ ri – File Ukazka prace File[] listFiles() vrac´ı pole abstraktn´ıch pathname reprezentuj´ıc´ıch ´ re v adresaˇ ´ ri danem ´ abstraktn´ım soubory a adresaˇ pathname File[] listFiles(FileFilter filter) vrac´ı pole abstraktn´ıch pathname reprezentuj´ıc´ıch ´ re v adresaˇ ´ ri danem ´ abstraktn´ım soubory a adresaˇ pathname, ktere´ odpov´ıdaj´ı filtru File[] listFiles(FilenameFilter filter) vrac´ı pole abstraktn´ıch pathname reprezentuj´ıc´ıch ´ re v adresaˇ ´ ri danem ´ abstraktn´ım soubory a adresaˇ pathname, ktere´ odpov´ıdaj´ı filtru Radek Koˇc´ı
´ ı XML ´ r Java – Proudy, Zpracovan´ Seminaˇ
12/ 38
´ ´ s adresaˇ ´ ri Ukazka prace
Rozhran´ı FilenameFilter definuje jednu metodu boolean accept(File dir, String name) ˇ b´yt obsaˇzen v seznamu – test, zda uveden´y soubor by mel Rozhran´ı FileFilter definuje jednu metodu boolean accept(File pathname) ˇ b´yt – test, zda uveden´y abstraktn´ı pathname by mel obsaˇzen v seznamu
Radek Koˇc´ı
´ ı XML ´ r Java – Proudy, Zpracovan´ Seminaˇ
13/ 38
´ ´ s adresaˇ ´ ri Ukazka prace File cesta = new File("."); String[] seznam; seznam = cesta.list(new FilenameFilter() { public boolean accept(File adr, String cesta) { String soubor = new File(cesta).getName(); return soubor.indexOf("x") != -1; } }); } for(String name : seznam) { System.out.println(name); }
Radek Koˇc´ı
´ ı XML ´ r Java – Proudy, Zpracovan´ Seminaˇ
14/ 38
´ ı proudy Binarn´ Vstupn´ı (odvozeny od abstraktn´ı tˇr´ıdy InputStream) pole bytu˚ soubor String roura ... V´ystupn´ı (odvozeny od abstraktn´ı tˇr´ıdy OutputStream) pole bytu˚ soubor ...
Radek Koˇc´ı
´ ı XML ´ r Java – Proudy, Zpracovan´ Seminaˇ
15/ 38
´ ı proudy Vstupn´ı binarn´ Operace void close() – uzavˇre proud, uvoln´ı zdroje abstract int read() – cˇ te byte, pokud nelze, vrac´ı -1 int read(byte[] b) – cˇ te b.length bytu˚ int read(byte[] b, int off, int len) – cˇ te len bytu˚ z proudu od pozice off long skip(long n) – pˇreskoˇc´ı n bytu˚ ´ ı pozici void mark(int readlimit) – poznaˇc´ı aktualn´ ˚ ktere´ lze pˇreˇc´ıst, neˇz se (readlimit je poˇcet bytu, znaˇcka stane nevalidn´ı) ´ ı void reset() – obnoven´ı pozice uchovane´ pˇri volan´ mark() boolean markSupported() Radek Koˇc´ı
´ ı XML ´ r Java – Proudy, Zpracovan´ Seminaˇ
16/ 38
´ ı proudy Vstupn´ı binarn´
Odvozene´ od FilterInputStream −→ InputStream java.io.BufferedInputStream – proud s ´ ˇı vyrovnavac´ ı pamet´ java.util.zip.CheckedInputStream – proud s kontroln´ım souˇctem javax.crypto.CipherInputStream – proud deˇsifruj´ıc´ı data java.io.DataInputStream – proud s metodami pro cˇ ten´ı hodnot primitivn´ıch datov´ych typu˚ ...
Radek Koˇc´ı
´ ı XML ´ r Java – Proudy, Zpracovan´ Seminaˇ
17/ 38
´ ı proudy V´ystupn´ı binarn´
analogicky k vstupn´ım InputStream ⇒ OutputStream ...
Radek Koˇc´ı
´ ı XML ´ r Java – Proudy, Zpracovan´ Seminaˇ
18/ 38
´ Ukazka
public static void main(String[] args) { try { FileOutputStream fos = new FileOutputStream("t.tmp"); ObjectOutputStream oos = new ObjectOutputStream(fos); oos.writeInt(12345); oos.writeObject("Today"); oos.writeObject(new Date()); oos.close(); ...
Radek Koˇc´ı
´ ı XML ´ r Java – Proudy, Zpracovan´ Seminaˇ
19/ 38
´ Ukazka FileInputStream fis = new FileInputStream("t.tmp"); ObjectInputStream ois = new ObjectInputStream(fis); int i = ois.readInt(); String today = (String) ois.readObject(); Date date = (Date) ois.readObject(); ois.close(); System.out.println(i + today + date); } catch (Exception ex) { ex.printStackTrace(); } } Radek Koˇc´ı
´ ı XML ´ r Java – Proudy, Zpracovan´ Seminaˇ
20/ 38
Znakove´ proudy Vstupn´ı (odvozeny od abstraktn´ı tˇr´ıdy Reader) BufferedReader PipedReader InputStreamReader FileReader −→ InputStreamReader ... V´ystupn´ı (odvozeny od abstraktn´ı tˇr´ıdy Writer) BufferedReader PipedWriter InputStreamWriter FileWriter −→ InputStreamWriter ... Radek Koˇc´ı
´ ı XML ´ r Java – Proudy, Zpracovan´ Seminaˇ
21/ 38
Konverze mezi proudy ´ ıho proudu (vstupn´ı/v´ystupn´ı) lze vytvoˇrit proud Z binarn´ znakov´y (vstupn´ı/v´ystupn´ı) // vytvoˇ r´ ıme bin´ arn´ ı vstupn´ ı proud InputStream is = ... // z is vytvoˇ r´ ıme znakov´ y proud (pro a sada) an´ ı se pouˇ zije std. znakov´ odov´ // dek´ Reader isr = new InputStreamReader(is); // znakov´ e sady jsou v bal´ ıku java.nio Charset chrs = java.nio.Charset.forName("ISO-8859-2"); r´ ıme znakov´ y proud (pro // z is vytvoˇ // dek´ odov´ an´ ı se pouˇ zije jin´ a znakov´ a sada) Reader isr2 = new InputStreamReader(is, chrs); Radek Koˇc´ı
´ ı XML ´ r Java – Proudy, Zpracovan´ Seminaˇ
22/ 38
Standardn´ı vstup a v´ystup
Ve tˇr´ıdeˇ java.lang.System static InputStream in static PrintStream out static PrintStream err ˇ standardn´ıch proudu˚ Zmena setIn(InputStream in) setOut(PrintStream out) setErr(PrintStream err)
Radek Koˇc´ı
´ ı XML ´ r Java – Proudy, Zpracovan´ Seminaˇ
23/ 38
Pˇr´ıklad – cˇ ten´ı ze std. vstupu public class ReadIn { public static void main(String[] args) { try { BufferedReader in = new BufferedReader( new InputStreamReader(System.in)); String line; while((line = in.readLine()).length() != 0) { System.out.println(line); } } catch(IOException ioe) { ioe.printStackTrace(System.err); } } } Radek Koˇc´ı
´ ı XML ´ r Java – Proudy, Zpracovan´ Seminaˇ
24/ 38
Komprimace Package java.util.zip BufferedReader in = new BufferedReader( new FileReader(args[0])); BufferedOutputStream out = new BufferedOutputStream(new GZIPOutputStream( new FileOutputStream(args[1]))); int b; while((b = in.read()) != -1) out.write(b); in.close(); out.close(); Radek Koˇc´ı
´ ı XML ´ r Java – Proudy, Zpracovan´ Seminaˇ
25/ 38
Serializace objektu˚
Serializace perzistence objektu˚ ´ ı reprezentace objektu jako sekvence bytu˚ z´ıskan´ uloˇzen´ı reprezentace do souboru Deserializace ´ objektu rekonstrukce serializovaneho
Radek Koˇc´ı
´ ı XML ´ r Java – Proudy, Zpracovan´ Seminaˇ
26/ 38
Serializace objektu˚ Serializovan´y objekt mus´ı implementovat rozhran´ı java.io.Serializable ´ e´ metody, slouˇz´ı pouze pro identifikaci nema´ zˇ adn ´ serializovatelneho objektu vˇsechny podˇr´ıdy tˇr´ıdy, ktera´ implementuje toto rozhran´ı, jsou take´ serializovatelne´
ˇ e´ objektu, ktere´ nemaj´ı b´yt serializovany, ´ promenn mus´ı b´yt ´ transient oznaˇceny modifikatorem ´ ı chovan´ ´ ı, mus´ı pokud je pˇri (de)serializace nutne´ specialn´ objekt definovat tyto metody private void readObject(ObjectInputStream is) private void writeObject(ObjectOutputStream os) viz API pro java.io.Serializable
Radek Koˇc´ı
´ ı XML ´ r Java – Proudy, Zpracovan´ Seminaˇ
27/ 38
Serializace objektu˚ – pˇr´ıklad
class Clovek implements Serializable { String jmeno; protected Clovek() { } public Clovek(String jmeno) { this.jmeno = jmeno; } public String info() { return jmeno; } }
Radek Koˇc´ı
´ ı XML ´ r Java – Proudy, Zpracovan´ Seminaˇ
28/ 38
Serializace objektu˚ – pˇr´ıklad
private static final String soubor = "clovek.dat"; public static void serializuj(Clovek p) throws Exception { FileOutputStream fos = new FileOutputStream(soubor); ObjectOutputStream oos = new ObjectOutputStream(fos); oos.writeObject(p); fos.close(); }
Radek Koˇc´ı
´ ı XML ´ r Java – Proudy, Zpracovan´ Seminaˇ
29/ 38
Serializace objektu˚ – pˇr´ıklad
public static Clovek deserializuj() throws Exception { FileInputStream fis = new FileInputStream(soubor); ObjectInputStream ois = new ObjectInputStream(fis); Clovek p = (Clovek)ois.readObject(); fis.close(); return p; }
Radek Koˇc´ı
´ ı XML ´ r Java – Proudy, Zpracovan´ Seminaˇ
30/ 38
´ s XML Prace XML ´ ret znaˇckovac´ı jazyky je standard konsorcia W3C jak vytvaˇ ´ ı ze zhruba o deset let mladˇs´ıho standardu ideoveˇ vychaz´ SGML (Structure Generalized Markup Language). ´ ı znaˇckovac´ı jazyk XML nen´ı jeden konkretn´ je to specifikace urˇcuj´ıc´ı, jak maj´ı vypadat znaˇckovac´ı jazyky je to metajazyk ´ eˇ jde o zjednoduˇsen´ı SGML standardu, aby se konceptualn ´ tvurc ´ u) usnadnila prace ˚ u˚ m parseru˚ (analyzator ˚ a aplikac´ı
´ se zakladn´ ım standardem uzce ´ souvisej´ı dalˇs´ı, napˇr. XML Namespaces, XInclude, XML Base. spoleˇcneˇ s dalˇs´ımi standardy (XSLT, XSL-FO, XHTML, CSS...) tvoˇr´ı ”rodinu” standardu˚ XML.
Radek Koˇc´ı
´ ı XML ´ r Java – Proudy, Zpracovan´ Seminaˇ
31/ 38
Struktura XML dokumentu Logicka´ ´ dokument se cˇ len´ı na elementy (jedna z nich je koˇrenova), atributy element˚u, textove´ uzly v elementech, intrukce pro ´ ı, notace, komentaˇ ´ re zpracovan´ ´ stromem element˚u dokument je reprezentovan Fyzicka´ jeden logick´y dokument muˇ ˚ ze b´yt uloˇzen ve v´ıce fyzick´ych ´ (entitach); ´ jednotkach vˇzdy alesponˇ v jedne´ – document entity.
Radek Koˇc´ı
´ ı XML ´ r Java – Proudy, Zpracovan´ Seminaˇ
32/ 38
´ ı XML dokumentu Zpracovan´
´ ı XML dat: Hlavn´ı typy rozhran´ı pro zpracovan´ Stromoveˇ orientovana´ rozhran´ı (Tree-based API) ´ Rozhran´ı zaloˇzena´ na udalostech (Event-based API) ´ ı” udalost´ ´ Rozhran´ı zaloˇzena´ na ”vytahovan´ ı/prvku˚ z dokumentu (Pull API) Implementace pro Javu parsery ´ JAXP (Java API for XML Processing) souˇcast http://java.sun.com/xml/jaxp/index.html ´ nezavisl e´ – napˇr. http://dom4j.org
Radek Koˇc´ı
´ ı XML ´ r Java – Proudy, Zpracovan´ Seminaˇ
33/ 38
Tree-based API
ˇ Mapuj´ı XML dokument na stromovou strukturu v pameti ´ dovoluj´ı libovolneˇ prochazet vznikl´y strom; ´ ejˇ ˇ s´ı je Document Object Model (DOM) konsorcia nejznam W3C, viz http://www.w3.org/DOM ´ ı prostˇred´ı Modely specificke´ pro konkretn´ pro Javu: JDOM – http://jdom.org pro Javu: dom4j – http://dom4j.org pro Python: 4Suite – http://4suite.org
Radek Koˇc´ı
´ ı XML ´ r Java – Proudy, Zpracovan´ Seminaˇ
34/ 38
Event-based API
´ Pˇri anal´yze dokumentu generuj´ı udalosti (podle toho, kde se ´ ı) nachazej´ ´ ıc´ı aplikace implementuje obsluhu techto ˇ zpracovavaj´ ´ udalost´ ı (pomoc´ı metod – callback) ´ ˇ neˇz stromova´ udalostmi rˇ´ızena´ rozhran´ı jsou ”niˇzsˇ ´ı urovn ´ e” ´ a´ ”v´ıce prace”) ´ (pro aplikaci zust ˚ av ˇ s´ı na pameˇ ˇt (i cˇ as), samotna´ anal´yza jsou usporn ´ ejˇ ´ r´ı trvale´ objekty nevytvaˇ
Radek Koˇc´ı
´ ı XML ´ r Java – Proudy, Zpracovan´ Seminaˇ
35/ 38
Event-based API
´ Udalost je . . . ´ zaˇcatek a konec dokumentu (start document, end document) ´ r (comment) komentaˇ odkaz na entitu (entity reference) ... ´ ejˇ ˇ s´ım rozhran´ım je SAX Nejznam (http://www.saxproject.org)
Radek Koˇc´ı
´ ı XML ´ r Java – Proudy, Zpracovan´ Seminaˇ
36/ 38
Event-based API Ukazka <doc> <para>Hello, world! Sled udalosti: start document start element: doc {seznam atributu: prazdny} start element: para {seznam atributu: prazdny} characters: Hello, world! end element: para end element: doc end document Radek Koˇc´ı
´ ı XML ´ r Java – Proudy, Zpracovan´ Seminaˇ
37/ 38
Zdroje informac´ı World Wide Web Consortium (W3C) http://www.w3.org/ XML Startkabel (EN/NL): aktuality, odkazy http://xml.startkabel.nl ´ u˚ a on-line referenc´ı v mnoha jazyc´ıch Soubor tutorial http://zvon.org ´ ´ atd. na vysoke´ O’Reilly XML.COM: cˇ lanky, tutorialy technicke´ urovni ´ http://xml.com Free XML Software (L. M. Garshol): kolekce odkazu˚ na nekomerˇcn´ı XML software http://www.garshol.priv.no/download/xmltools/ Kolekce odkazu˚ na obecn´y XML software (i komerˇcn´ı) http://xmlsoftware.com J. Kosek: http://kosek.cz/xml/index.html Radek Koˇc´ı
´ ı XML ´ r Java – Proudy, Zpracovan´ Seminaˇ
38/ 38