K1223.qxd
24.3.2006
15:26
StrÆnka 3
Obsah
Předmluva
13
Předmluva k druhému vydání Předmluva k prvnímu vydání Pro koho je tato kniha určena Co v této knize najdete? Poznámky k platformě Jiné knihy Konvence používané v knize Komentáře a otázky Stažení zdrojových kódů Poděkování
13 14 15 16 18 19 21 22 23 24
1. Začínáme: překlad, spuštění a ladění 1.1 1.2 1.3 1.4 1.5 1.6 1.7 1.8 1.9 1.10 1.11 1.12 1.13 1.14 1.15 1.16 1.17
27
Překlad a spuštění programů v Javě: JDK Upravování a překlad pomocí editoru s podporou barevného zvýrazňování syntaxe Překlad, spouštění a testování pomocí IDE Efektivní používání CLASSPATH Použití tříd API cz.darwinsys z této knihy Překlad zdrojového kódu příkladů z této knihy Automatický překlad pomocí nástroje Ant Spouštění apletů Zpracování varování o zavržení Podmíněné ladění bez #ifdef Ladění výstupů Udržování korektnosti programu pomocí asercí Ladění pomocí JDB Jednotkové testy: vyhněte se potřebě ladících nástrojů Získejte čitelné zpětné sledování Hledání dalších zdrojových kódů v Javě Program: Debug
Obsah
27 29 30 36 38 39 40 43 44 46 47 49 50 53 55 56 58
3
K1223.qxd
24.3.2006
15:26
StrÆnka 4
2. Komunikace s prostředím 2.1 2.2 2.3 2.4 2.5 2.6
Získání proměnných prostředí Systémové vlastnosti Psaní kódu závislého na verzi JDK Psaní kódu závislého na operačním systému Použití rozšíření nebo dalších zapouzdřených API Syntaktická analýza argumentů příkazového řádku
3. Řetězce 3.1 3.2 3.3 3.4 3.5 3.6 3.7 3.8 3.9 3.10 3.11 3.12 3.13 3.14 3.15
4
59 61 63 64 66 67
75
Rozkládání řetězců do podřetězců 77 Rozkládání řetězců pomocí StringTokenizer 78 Spojování řetězců pomocí operátoru +, StringBuilder (JDK 1.5) a StringBuffer 81 Zpracování řetězce po jednom znaku 83 Zarovnání řetězců 84 Převody mezi znaky Unicode a řetězci 86 Převracení řetězce po slovech nebo znacích 88 Rozšiřování a komprese tabulátorů 89 Ovládání velikosti písmen 94 Odsazení textových dokumentů 95 Vkládání netisknutelných znaků 96 Odstraňování mezer z konce řetězce 97 Syntaktická analýza dat oddělených čárkou 99 Program: Jednoduchý formátovač textu 104 Program: Fonetický porovnávač názvů (soundex) 106
4. Porovnávání vzorů pomocí regulárních výrazů 4.1 4.2 4.3 4.4 4.5 4.6 4.7 4.8 4.9 4.10 4.11 4.12
59
Syntaxe regulárních výrazů Použití regulární výrazů v Javě: Test na vzor Hledání odpovídajícího textu Nahrazení odpovídajícího textu Tisk všech výskytů vzoru Vypisování řádků obsahující vzory Ovládání velikosti písmen v regulárních výrazech Porovnávání „akcentovaných“ nebo složených znaků Porovnávání nových řádků v textu Program: Syntaktická analýza protokolového souboru serveru Apache Program: Dolování dat Program: Úplný Grep
Obsah
109 111 117 121 123 124 126 127 129 130 132 133 135
K1223.qxd
24.3.2006
15:26
StrÆnka 5
5. Čísla 5.1 5.2 5.3 5.4 5.5 5.6 5.7 5.8 5.9 5.10 5.11 5.12 5.13 5.14 5.15 5.16 5.17 5.18 5.19 5.20 5.21
141
Kontrola, jestli je řetězec platné číslo Ukládání větších čísel do menších čísel Převádění čísel na objekty a naopak Vytvoření zlomku z celého čísla bez použití čísla s plovoucí desetinnou čárkou Zajištění přenosnosti čísel s plovoucí desetinnou čárkou Porovnávání čísel s plovoucí desetinnou čárkou Zaokrouhlování čísel s plovoucí desetinnou čárkou Formátování čísel Převod mezi dvojkovými, osmičkovými, desítkovými a šestnáctkovými čísly Zpracování skupiny celých čísel Práce s římskými číslicemi Správné formátování množného čísla Generování náhodných čísel Generování lepších náhodných čísel Počítání trigonometrických funkcí Logaritmování Násobení matic Používání komplexních čísel Zpracování velmi velkých čísel Program: Převodník teplot Program: Číselné palindromy
6. Data a časy 6.1 6.2 6.3 6.4 6.5 6.6 6.7 6.8 6.9 6.10 6.11 6.12 6.13 6.14
143 144 145 146 147 149 151 151 154 155 156 159 161 162 164 164 165 166 169 171 174
177
Nalezení dnešního datumu Vypsání datumu/času v daném formátu Znázornění dat v jiných epochách Převádění YMDHMS na kalendář nebo sekundy letopočtu Převod řetězců na data Převádění sekund epochy na DMYHMS Sčítání nebo odčítání množství od datumu nebo kalendáře Rozdíly mezi dvěma daty Porovnávání dat Den týdne/měsíce/roku nebo číslo týdne Vytváření stránky kalendáře Měření uplynulého času Dopřejte si chvilku odpočinku Program: Upomínací služba
178 179 182 182 184 185 186 187 188 189 190 192 194 195
Obsah
5
K1223.qxd
24.3.2006
15:26
StrÆnka 6
7. Strukturování dat pomocí Javy 7.1 7.2 7.3 7.4 7.5 7.6 7.7 7.8 7.9 7.10 7.11 7.12 7.13 7.14 7.15 7.16 7.17
Použití polí pro strukturování dat Změna velikosti pole Dynamičtější pole Použití iterátorů pro datově nezávislý přístup Strukturování dat v spojovém seznamu prvků Mapování pomocí Hashtable a HashMap Ukládání řetězců do vlastností a preferencí Seřazení kolekce Vyhýbejte se nutnosti uspořádávat data Vyvarujte se duplicitních hodnot Hledání objektu v kolekci Převádění kolekce na pole Definice vlastního iterátoru Zásobník Vícerozměrné struktury Konečně kolekce Program: Porovnání časové náročnosti
8. Novinky ve verzi 5.0 8.1 8.2 8.3 8.4 8.5 8.6
Použití parametrizovaných kolekcí Použití rozšíření cyklů for Vyhnutí se přetypování pomocí parametrizace typů Dovolte Javě automatické převody mezi primitivními a jejich obalovými typy Výčtové typy Program: MediaInvoicer
9. Objektově orientované techniky 9.1 9.2 9.3 9.4 9.5 9.6 9.7 9.8 9.9 9.10 9.11 9.12
6
Tisk objektů: Formátování pomocí toString() Překrytí metody equals Překrytí metody hashCode Metoda clone Metoda finalize Použití interních, tj. vnořených, vnitřních a lokálních tříd* Poskytování zpětných volání přes rozhraní Polymorfizmus/abstraktní metody Předávání hodnot Aplikace návrhového vzoru Jedináček (Signleton) Vytváření vlastních výjimek Program: Plotter
Obsah
199 200 201 202 204 205 207 208 212 216 217 218 220 220 222 223 225 227
229 230 231 232 234 235 239
243 245 246 249 250 252 254 256 259 260 263 265 265
K1223.qxd
24.3.2006
15:26
StrÆnka 7
10. Vstup a výstup 10.1 10.2 10.3 10.4 10.5 10.6 10.7 10.8 10.9 10.10 10.11 10.12 10.13 10.14 10.15 10.16 10.17 10.18 10.19 10.20 10.21 10.22
269
Načítání ze standardního vstupu Zapisování do standardního výstupu Vypisování pomocí třídy Formatter z JDK 1.5 Prohledávání souboru pomocí StreamTokenizeru Prohledávání vstupu pomocí třídy JDK 1.5 Scanner Otevírání souboru podle názvu Kopírování souboru Načítání souboru do řetězce Přesměrování standardních proudů Duplikování proudu tak, jak se zapíše Čtení/zapisování různých znakových sad Otravné znaky konce řádku Dejte si pozor na kód závislý na platformě Čtení „pokračujících“ řádků Binární data Hledání Zapisování datových proudů z C Ukládání a obnovování objektů Javy Předcházení výjimkám ClassCastExceptions pomocí SerialVersionUID Čtení a zapisování archívů JAR nebo Zip Čtení a zapisování komprimovaných souborů Program: Převod textu na PostScript
270 274 275 279 283 287 288 291 291 292 294 295 295 296 301 302 303 305 308 309 312 313
11. Operace nad adresáři a systémem souborů 11.1 11.2 11.3 11.4 11.5 11.6 11.7 11.8 11.9 11.10
317
Získání informací o souborech Vytvoření souboru Přejmenování souboru Mazání souboru Vytvoření dočasného souboru Změna atributů souboru Procházení adresářové struktury Získání kořenových adresářů Vytváření nových adresářů Program: Find
317 320 321 322 323 325 326 328 329 330
12. Programování externích zařízení: sériové a paralelní porty 12.1 12.2 12.3 12.4
Výběr portu Otevření sériového portu Otevírání paralelního portu Řešení konfliktů mezi porty
333 335 338 342 345
Obsah
7
K1223.qxd
24.3.2006
12.5 12.6 12.7 12.8
15:26
StrÆnka 8
Čtení a zápis: lock- step Čtení a zápis: řízené událostmi Čtení a zápis: vlákna Program: plotter Penman
13. Grafika a zvuk 13.1 13.2 13.3 13.4 13.5 13.6 13.7 13.8 13.9 13.10 13.11 13.12 13.13
Zobrazení grafiky pomocí objektu třídy Graphics Testování grafických komponent Zobrazení textu Zobrazení textu zarovnaného na střed Zobrazení stínu Zobrazení textu pomocí tříd z balíčku 2DGraphics Zobrazení textu s integrovaným typem písma Zobrazení obrázku Přehrávání zvukových souborů Přehrávání videoklipů Tisk v Javě Program: PlotterAWT Program: Grapher
14. Grafické uživatelské rozhraní 14.1 14.2 14.3 14.4 14.5 14.6 14.7 14.8 14.9 14.10 14.11 14.12 14.13 14.14 14.15
Zobrazení komponent GUI Návrh rozvržení okna Zobrazení panelu s kartami Správa událostí: tlačítka Ošetřování událostí pomocí anonymních vnitřních tříd Ukončení programu „zavřením okna“ Dialogy: když „později“ je příliš pozdě Zachycení a formátování výjimek grafického uživatelského rozhraní Zobrazení programového výstupu v okně Výběr hodnoty pomocí komponenty JSpinner Výběr souboru pomocí komponenty JFileChooser Výběr barvy Formátování komponent JComponents pomocí HTML Vystředění hlavního okna Změna vzhledu a chování programu používajícího pro vytvoření GUI třídy knihovny Swing 14.16 Rozšíření grafického uživatelského rozhraní pro Mac OS X 14.17 Program: upravený dialog pro výběr písma 14.18 Program: upravený správce rozvržení
8
Obsah
348 350 354 356
361 361 363 364 364 365 368 370 373 377 378 381 384 387
391 392 394 397 398 400 402 406 408 410 413 414 417 419 420 421 425 427 431
K1223.qxd
24.3.2006
15:26
StrÆnka 9
15. Podpora cizích jazyků a lokalizace 15.1 15.2 15.3 15.4 15.5 15.6 15.7 15.8 15.9 15.10 15.11 15.12
439
Tvorba tlačítka pomocí prostředků I18N Výpis dostupných národních prostředí Vytváření nabídky pomocí prostředků I18N Vytváření konvenčních rutin pro internacionalizaci Vytváření dialogového okna pomocí prostředků I18N Vytváření svazku prostředků (resource bundle) Vytahování řetězců ze zdrojového kódu Nastavení odlišného národního prostředí Nastavení výchozího národního prostředí Formátování textu zprávy Program: MenuIntl Program: BusCard
439 441 442 443 445 446 447 448 449 450 452 454
16. Síťoví klienti 16.1 16.2 16.3 16.4 16.5 16.6 16.7 16.8 16.9 16.10
459
Navázání spojení se serverem Hledání a oznamování síťových adres Ošetřování síťových chyb Čtení a zápis textových dat Čtení a zápis binárních dat Čtení a zápis serializovaných dat Datagramy protokolu UDP Program: Klient TFTP implementovaný pomocí protokolu UDP Program: klient programu Telnet Program: Klient pro chat
461 462 463 464 466 468 470 472 476 479
17. Serverová Java: sokety 17.1 17.2 17.3 17.4 17.5 17.6 17.7 17.8 17.9 17.10 17.11
485
Uvedení serveru do provozu Odeslání odpovědi (textové i binární) Odeslání informací pomocí objektů Zpracování více klientů Obsluha protokolu HTTP Zabezpečení webového serveru pomocí SSL a JSSE Protokolování síťového provozu Protokolování síťě pomocí log4j Protokolování v síti pomocí JDK 1.4 Hledání síťových rozhraní Program: Chatový server v Javě
485 488 491 492 497 499 501 506 508 510 511
Obsah
9
K1223.qxd
24.3.2006
15:26
StrÆnka 10
18. Síťoví klienti II: Aplety a weboví klienti 18.1 18.2 18.3 18.4 18.5 18.6 18.7 18.8 18.9 18.10 18.11 18.12 18.13
Vložení Javy do webové stránky Techniky vytváření apletů Kontaktování serveru na hostitelském počítači apletu Zobrazení dokumentu pomocí apletu Spuštění JavaScriptu pomocí apletu Spuštění skriptu CGI pomocí apletu Čtení obsahu z dané adresy URL URI, URL nebo URN? Vytahování značek HTML z URL Vytahování adres URL ze souboru Převod názvu souboru na adresu URL Program: MkIndex Program: LinkChecker
19. Java a elektronická pošta 19.1 19.2 19.3 19.4 19.5 19.6 19.7 19.8 19.9
Zasílání e-mailu: Verze pro prohlížeč Opravdové zasílání e-mailů Serverový program s podporou pro e–maily Zasílání e-mailů v kódování MIME Poskytování nastavení e-mailu Zasílání e-mailů bez použití JavaMail Čtení e-mailů Program: MailReaderBean Program: MailClient
20. Databázový přístup 20.1 20.2 20.3 20.4. 20.5 20.6 20.7 20.8 20.9 20.10 20.11 20.12 20.13
10
Jednoduchý databázový přístup pomocí JDO Textové databáze Databáze DBM Nastavení JDBC a připojení Připojení k databázi JDBC Zasílání dotazu JDBC a získávání výsledků Použití připravených příkazů JDBC Použití uložených procedur pomocí JDBC Modifikace dat pomocí ResultSet Uchovávání výsledků v RowSet Modifikace dat pomocí SQL Hledání metadat JDBC Program: SQLRunner
Obsah
517 517 519 521 524 526 527 528 529 530 533 534 535 540
547 547 552 554 558 560 561 566 570 573
585 586 589 593 596 598 601 604 608 608 609 611 613 617
K1223.qxd
24.3.2006
15:26
StrÆnka 11
21. XML 21.1 21.2 21.3 21.4 21.5 21.6 21.7
629 Generování XML z objektů Transformování XML pomocí XSLT Syntaktická analýza XML pomocí SAX Syntaktická analýza XML pomocí DOM Ověřování struktury pomocí DTD Generování vlastního XML pomocí DOM Program: xml2mif
631 632 635 637 641 642 644
22. Distribuovaná Java: RMI 22.1 22.2 22.3 22.4 22.5 22.6
647
Definování podmínek RMI Vytváření klienta RMI Vytváření serveru RMI Zavádění RMI přes síť Program: Zpětné volání RMI Program: NetWatch
648 650 651 653 654 657
23. Balíčky a balení 23.1 23.2 23.3 23.4 23.5 23.6 23.7 23.8 23.9 23.10 23.11 23.12 23.13 23.14
665
Vytváření balíčku Dokumentace tříd pomocí Javadoc Za hranice JavaDoc: Anotace/Metadata (JDK 1.5) a XDoclet Archivace do souborů jar Spouštění apletu z archívu JAR Spuštění apletu pomocí moderního JRE Spouštění aplikace z archívu JAR Příprava třídy jako JavaBean Vkládání komponenty JavaBean do archívu JAR Balení serveletu do souboru WAR „Jedenkrát vytvořte a instalujte kdekoli“ „Jednou vytvořte a instalujte na systémy Mac OS X“ Java Web Start Podepisování vašeho souboru JAR
666 667 671 673 674 675 678 680 684 685 685 686 688 693
24. Práce s vlákny 24.1 24.2 24.3 24.4 24.5 24.6
695
Spouštění kódu v odlišném vláknu Zobrazení pohyblivého obrázku pomocí animace Zastavení vlákna Rendezvous vláken a časové limity Synchronizace vláken pomocí klíčového slova synchronized Zjednodušování synchronizace pomocí zámků JDK 1.5
696 700 704 706 707 712
Obsah
11
K1223.qxd
24.3.2006
15:26
StrÆnka 12
24.7 Synchronizace vláken pomocí wait(?) a notifyAll(?) 24.8 Zjednodušení modelu producent-konzument pomocí rozhraní Queue sady JDK 1.5 24.9 Automatické ukládání v editoru 24.10 Program: Síťový server s vlákny 24.11 Zjednodušení serverů pomocí Concurrency Utilities (JDK 1.5)
25. Reflexe 25.1 25.2 25.3 25.4 25.5 25.6 25.7 25.8
716 721 724 725 732
735
Deskriptor tříd Hledání a používání metod a proměnných Dynamické zavádění tříd a vytváření instancí Vytváření třídy úplně od začátku Měření výkonu Vypisování informací o třídě Program: CrossRef Program: AppletViewer
736 737 740 742 743 746 748 753
26. Použití Javy s jinými programovacími jazyky
761
26.0 26.1 26.2 26.3 26.4 26.5 26.6 26.7
Úvod Spuštění programu Spuštění programu a zachytávání jeho výstupu Propojení Javy se skripty pomocí rozhraní BSF Kombinace jazyků Java a Perl Použití nativního kódu (jazyky C/C++) Volání Javy z nativního kódu Program: DBM
761 761 765 768 772 776 781 782
27. Doslov
785
Rejstřík
787
12
Obsah