Úvod do programovacích jazyků (Java) Michal Krátký Katedra informatiky VŠB Technická univerzita Ostrava Úvod do programovacích jazyků (Java), 2007/2008 c 2006 2008 Michal Krátký Úvod do programovacích jazyků (Java) 1/39
Balíčky (Packages) 1/2 Balíčky jsou skupiny tříd a rozhraní. Umožňují vyhnout se konfliktům ve jménech tříd. Balíček může obsahovat třídy, rozhraní a další balíčky (pod-balíčky). Každý balíček má jméno. Celé jméno balíčku obsahuje tečkami oddělený seznam nad-balíčků až k danému balíčku. Např.: java.lang, com.sun.security, drawing.figures. c 2006 2008 Michal Krátký Úvod do programovacích jazyků (Java) 2/39
Balíčky 2/2 Balíček ke kterému třída přísluší je specifikován na začátku souboru, např.: package drawing. f i g u r e s ; class Line extends Figure {... Třída náleží do balíčku drawing.figures. Pokud na začátku souboru nespecifikujeme žádný balíček, pak třída náleží ke speciálnímu nepojmenovanému balíčku. c 2006 2008 Michal Krátký Úvod do programovacích jazyků (Java) 3/39
Normativní jména tříd a rozhraní Každá třída nebo rozhraní má normativní jméno (canonic name) obsahující balíček ke kterému náleží a jméno třídy nebo rozhraní. Např. drawing.figures.line. Pro dvě různé třídy nebo rozhraní můžeme použít stejné jméno pokud náleží k různým balíčkům (a mají tedy různá normativní jména). Např. v balíčku project.graphics definujeme jinou třídu Line s normativním jménem project.graphics.line. Vždy můžeme použít normativní jméno třídy nebo rozhraní, když se odkazujeme na třídu nebo rozhraní. Např. drawing.figures.line line = new drawing.figures.line(); c 2006 2008 Michal Krátký Úvod do programovacích jazyků (Java) 4/39
Veřejné třídy a rozhraní Pouze třídy a rozhraní deklarované jako public jsou přístupné z jiných balíčků. Např. třída drawing.figures.line: package drawing. f i g u r e s ; public class Line extends Figure {... je přístupná ve všech balíčcích. Pokud chceme, aby byla třída přístupná pouze ve třídách a rozhraních balíčku package drawing.figures, deklarujeme: package drawing. f i g u r e s ; class Line extends Figure {... c 2006 2008 Michal Krátký Úvod do programovacích jazyků (Java) 5/39
Hierarchie balíčků Jména balíčků korespondují s adresáři v adresářové struktuře. Např. třída drawing.figures.line je uložena v souboru: drawing/figures/line.java (Unix) resp. drawing\figures\line.java (MS Windows). Soubory obsahující třídy z nepojmenovaného balíčku jsou uloženy v aktuálním adresáři. c 2006 2008 Michal Krátký Úvod do programovacích jazyků (Java) 6/39
Deklarace import Pokud se odkazujeme na třídu nebo rozhraní z jiného balíčku, můžeme použít její normativní jméno. Např. drawing.figures.line line = new drawing.figures.line(); Můžeme ovšem použít deklaraci import, která nám umožňuje odkazovat se na třídy a rozhraní z tohoto balíčku pouze jednoduchým jménem. Dva typy deklarace import: Jednoduchá - importujeme pouze jednu třídu nebo rozhraní. Např.: import drawing.figures.line; Složená deklarace (on demand) importujeme všechny veřejné třídy a rozhraní z balíčku. Např.: import drawing.figures.*; c 2006 2008 Michal Krátký Úvod do programovacích jazyků (Java) 7/39
Java API API Application Programming Interface. Množina tříd, kterou má programátor k dispozici, součásti: java.io.* vstup/výstup.... Ke každé třídě nalezneme v dokumentaci definované atributy a metody. c 2006 2008 Michal Krátký Úvod do programovacích jazyků (Java) 8/39
(Exceptions) Pro ošetření chyb poskytuje Java mechanismus zvaný výjimky (Exceptions): Když nastane v programu chyba, program vygeneruje událost výjimku. Běh programu je přerušen a runtime hledá kód ošetřující příslušný typ chyby exception handler. Poznámka: objekt nesoucí informaci o události je také nazýván výjimka. c 2006 2008 Michal Krátký Úvod do programovacích jazyků (Java) 9/39
, příklad public s t a t i c void main ( S t r i n g [ ] args ) { t r y { i n t pole [ ] = new i n t [ 3 ] ;... i n t a = pole [ 5 ] ; catch ( ArrayIndexOutOfBoundsException e ) { System. e r r. p r i n t l n ( " Chyba " ) ; c 2006 2008 Michal Krátký Úvod do programovacích jazyků (Java) 10/39
Když nastane výjimka: Je vytvořen objekt výjimky, který obsahuje informace o výjimce (typ, stav programu,... ). Běh programu je přerušen. Runtime hledá kód ošetřující chybu. Kód zachycující výjimku se nazývá exception handler (catch). Výběr handleru závisí na typu objektu výjimky. Zachytávání výjimek se skládá ze tří bloků: try, catch a finally c 2006 2008 Michal Krátký Úvod do programovacích jazyků (Java) 11/39
Syntaxe: t r y {... catch (... ) {... catch (... ) {... f i n a l l y {... Za try blokem musí následovat nejméně jeden blok catch nebo finally. c 2006 2008 Michal Krátký Úvod do programovacích jazyků (Java) 12/39
, blok try Syntaxe: t r y {... / / p r i k a z y Blok try definuje platnost handleru. Pokud výjimka nastane v bloku try, výjimka je ošetřena příslušným handlerem asociovaným s tímto blokem. c 2006 2008 Michal Krátký Úvod do programovacích jazyků (Java) 13/39
, blok catch Syntaxe: catch ( SomeThrowableObject variablename ) {... / / p r i k a z y Za try může nasledovat několik bloků catch, ale nejvýše jeden blok finally. Proměnná variablename je jméno výjimky na které se můžeme v kódu odkazovat. Platnost této proměnné je v bloku try. Proměnná může být použita jako jiné lokální proměnné, např. variablename.getmessage(); Konvence: Často tuto proměnnou pojmenováváme e. c 2006 2008 Michal Krátký Úvod do programovacích jazyků (Java) 14/39
, blok finally Blok finally poskytuje mechanismus umožňující vykonání kódu bez ohledu na to zda v bloku try nastala nebo nenastala výjimka. Příkazy v bloku finally jsou vykonány pokud: Blok try je standardně ukončen. V bloku try nastane výjimka, která je ošetřena jedním z handlerů. V bloku try nastane výjimka, která není ošetřena žádným handlerem. t r y {... / / o t e v r i soubor a zapis do nej f i n a l l y { i f ( f i l e! = null ) f i l e. close ( ) ; c 2006 2008 Michal Krátký Úvod do programovacích jazyků (Java) 15/39
, metody Metody nemusí ošetřovat všechny výjimky, mohou vyvolat výjimku k volané metodě. Pokud výjimka typu T může být vyvolána v metodě a metoda neošetřuje výjimku typu T, pak musíme specifikovat, že metoda může vyvolat výjimku typu T. K tomuto účelu použijeme klíčové slovo throw v hlavičce metody: public void r e a d F i l e ( S t r i n g filename ) throws IOException {... throw new IOException ( ) ; / / v y t v o r e n i vyjimky c 2006 2008 Michal Krátký Úvod do programovacích jazyků (Java) 16/39
, hierarchie výjimek Pomocí dědičnosti můžeme vytvářet vlastní výjimky(předek Throwable), výhody: Seskupování chybových typů. Zjemňování chybových stavů. public class StackException extends Exception { public StackException ( S t r i n g message ) { super ( message ) ; public class EmptyStackException extends StackException { public EmptyStackException ( ) { super ( " Zasobnik j e prazdny. " ) ; c 2006 2008 Michal Krátký Úvod do programovacích jazyků (Java) 17/39
Program často potřebuje číst nebo zapsat data z/do externích zdrojů. Data může obsahovat soubor na disku, soubor na síti, blok paměti atd. Proudy reprezentují abstrakci umožňující sekvenční čtení a zápis dat. Při použití proudů můžeme přistupovat k datům bez ohledu na to z jakého zdroje je čteme popř. zapisujeme. c 2006 2008 Michal Krátký Úvod do programovacích jazyků (Java) 18/39
Proudy Rozlišujeme dva typy proudů: vstupní proudy pro čtení dat, výstupní proudy pro zápis dat. Pro čtení a zápis dat používáme podobná schémata: Otevření proudu. Dokud jsou v proudu data, čti. / Dokud jsou data, zapisuj. Uzavření proudu. c 2006 2008 Michal Krátký Úvod do programovacích jazyků (Java) 19/39
Proudy Balík java.io obsahuje kolekci tříd pro práci s proudy. Třídy rozdělujeme do dvou hierarchií: Binární proudy pracují s proudy binárních dat. Podtřídy tříd: InputStream - vstupní proud, OutputStream - výstupní proud. Znakové proudy pracují s proudy znaků. Podtřídy tříd: Reader - vstupní proud, Writer - výstupní proud. c 2006 2008 Michal Krátký Úvod do programovacích jazyků (Java) 20/39
Proudy, metody InputStream: i n t read ( ) i n t read ( byte [ ] b ) i n t read ( byte [ ] b, i n t o f f, i n t len ) OutputStream: void w r i t e ( i n t b ) void w r i t e ( byte [ ] b ) void w r i t e ( byte [ ] b, i n t o f f, i n t len ) Reader: i n t read ( ) i n t read ( char [ ] cbuf ) i n t read ( char [ ] cbuf, i n t o f f, i n t len ) c 2006 2008 Michal Krátký Úvod do programovacích jazyků (Java) 21/39
Proudy, metody Writer: void w r i t e ( i n t c ) void w r i t e ( char [ ] cbuf ) void w r i t e ( char [ ] cbuf, i n t o f f, i n t len ) Další metody: Všechny třídy obsahují metodu close(). Tato metoda je bud volána explicitně nebo implicitně při rušení objektu garbage collectorem. c 2006 2008 Michal Krátký Úvod do programovacích jazyků (Java) 22/39
Proudy, metody Třídu InputStream a Reader obsahují metody: long skip ( long n ) / / preskoceni n bytu boolean marksupported ( ) / / oznaceni a k t u a l n i h o bytu void mark ( i n t readaheadlimit ) void r e s e t ( ) Třídy OutputStream a Writer obsahují metodu: void f l u s h ( ) / / vyprazdneni buferu Většina metod pracující s proudy vyhazuje výjimku java.io.ioexception nebo některou z jejich podtříd. c 2006 2008 Michal Krátký Úvod do programovacích jazyků (Java) 23/39
Souborové proudy 1/3 Souborové proudy čtou nebo zapisují do souborů na souborovém systému. FileInputStream FileOutputStream FileReader FileWriter c 2006 2008 Michal Krátký Úvod do programovacích jazyků (Java) 24/39
Souborové proudy 2/3 Příklad: Reader i n = new FileReader ( " i n p u t. t x t " ) ; W r i t e r out = new F i l e W r i t e r ( " output. t x t " ) ; i n t c ; while ( ( c = i n. read ( ) ) > = 0 ) { out. w r i t e ( c ) ; i n. close ( ) ; out. close ( ) ; c 2006 2008 Michal Krátký Úvod do programovacích jazyků (Java) 25/39
Souborové proudy 3/3 Čtení data byt po bytu není příliš efektivní. Snažíme se tedy číst data po větších blocích. InputStream i n = new FileInputStream ( " i n p u t. t x t " ) ; OutputStream o u t = new FileOutputStream ( " output. t x t " ) ; f i n a l i n t BUFFER_LENGTH = 8 1 9 2 ; byte [ ] buf = new byte [BUF_LEN ] ; i n t l ; while ( ( l = i n. read ( buf, 0, BUF_LEN ) ) > = 0 ) { out. w r i t e ( buf, 0, l ) ; i n. close ( ) ; out. close ( ) ; c 2006 2008 Michal Krátký Úvod do programovacích jazyků (Java) 26/39
Třída File 1/2 Instance třídy java.io.file reprezentuje soubor na souborovém systému. Pokud vytvoříme instanci třídy File pro nějaký soubor, můžeme zjišt ovat následující informace: Plné jméno souboru. Jméno rodičovského adresáře. Zda se jedná o soubor nebo adresář. Zda je zadán absolutně nebo relativně. Zda existuje. Velikost souboru. Přístupová práva (čtení, zápis). Čas modifikace, zda je skrytý apod. c 2006 2008 Michal Krátký Úvod do programovacích jazyků (Java) 27/39
Třída File 2/2 Instanci třídy java.io.file můžeme použít pro: Vytváření souboru. Rušení souboru. Přejmenování souboru. Vylistování adresáře. Vytvoření podadresáře. Nastavení času modifikace. Vytvoření pomocných souborů (temporary files). S t r i n g filename = " t e s t. t x t " ; F i l e f = new F i l e ( filename ) ; boolean ok = f. d e l e t e ( ) ; System. out. p r i n t l n ( ok? "O. K. " : " Not deleted " ) ; c 2006 2008 Michal Krátký Úvod do programovacích jazyků (Java) 28/39
Standardní vstup a výstup Ve třídě System jsou definovány tyto třídní konstantní proměnné: in - standardní vstup (InputStream), implicitně klávesnice. out - standardní výstup (PrintStream), implicitně obrazovka. err - standardní chybový výstup (PrintStream). Všechny tyto proudy jsou implicitně otevřené a nemohou být uzavřeny. Všechny tyto proudy je možné přesměrovat. $ java ClassName < i n p u t. t x t > output. t x t $ java ClassName < i n p u t. t x t less Ukončení vstupu: ^Z (Windows), ^D (Linux). c 2006 2008 Michal Krátký Úvod do programovacích jazyků (Java) 29/39
Další třídy Čtení a zápis primitivních datových typů DataInputStream, DataOutputStream. Náhodný přístup k datům RandomAccessFile. (PrintStream). BufferedInputStream, BufferedOutputStream. c 2006 2008 Michal Krátký Úvod do programovacích jazyků (Java) 30/39
Příklad, DoubleArray.java 1/4 package streamtest ; public class DoubleArray { double marray [ ] ; public DoubleArray ( i n t c a p a c i t y ) { marray = new double [ c a p a c i t y ] ; c 2006 2008 Michal Krátký Úvod do programovacích jazyků (Java) 31/39
Příklad, DoubleArray.java 2/4 public void setvalue ( i n t index, double value ) { marray [ index ] = value ; public double getvalue ( i n t index ) { return marray [ index ] ; c 2006 2008 Michal Krátký Úvod do programovacích jazyků (Java) 32/39
Příklad, DoubleArray.java 3/4 public void p r i n t ( ) { for ( i n t i = 0 ; i < marray. l e n g t h ; i ++) { System. out. p r i n t ( marray [ i ] + " " ) ; System. out. p r i n t ( " \ n " ) ; c 2006 2008 Michal Krátký Úvod do programovacích jazyků (Java) 33/39
Příklad, DoubleArray.java 4/4 public void s o r t ( ) { for ( i n t i = 0 ; i < marray. l e n g t h ; i ++) { for ( i n t j = 0 ; j < marray. length 1 ; { i f ( marray [ j ] > marray [ j + 1 ] ) { double tmp = marray [ j ] ; marray [ j ] = marray [ j + 1 ] ; marray [ j + 1 ] = tmp ; c 2006 2008 Michal Krátký Úvod do programovacích jazyků (Java) 34/39
Příklad, StreamApp.java 1/4 package streamtest ; public class StreamApp { DoubleArray mdoublearray ; public StreamApp ( ) { mdoublearray = new DoubleArray ( 1 0 ) ; c 2006 2008 Michal Krátký Úvod do programovacích jazyků (Java) 35/39
Příklad, StreamApp.java 2/4 public s t a t i c void main ( S t r i n g [ ] args ) { new StreamApp ( ). Run ( ) ; public void Run ( ) { read ( ) ; mdoublearray. p r i n t ( ) ; mdoublearray. s o r t ( ) ; mdoublearray. p r i n t ( ) ; c 2006 2008 Michal Krátký Úvod do programovacích jazyků (Java) 36/39
Příklad, StreamApp.java 3/4 private void read ( ) { f i n a l i n t length = 1 0 2 4 ; i n t array [ ] = new i n t [ l e n gth ] ; i n t i = 0 ; t r y { while ( ( array [ i + + ] = System. i n. read ( ) )! = 1 ) { catch ( Exception e ) { c 2006 2008 Michal Krátký Úvod do programovacích jazyků (Java) 37/39
Příklad, StreamApp.java 4/4 S t r i n g s t r = " " ; i n t countofnumber = 0 ; / / 4 5 6 4 8 1... for ( i n t j = 0 ; j < i ; j + + ) { i f ( array [ j ] = = j = = i 1 ) { double v = Double. parsedouble ( s t r ) ; mdoublearray. setvalue ( countofnumber ++, v ) ; s t r = " " ; else { s t r + = ( char ) array [ j ] ; c 2006 2008 Michal Krátký Úvod do programovacích jazyků (Java) 38/39
Parametry předávané programu při spouštění, např.: java c a t e s t. App 1 9 4 5 6 Parametry jsou přístupné přes pole řetězců předávané metodě main jako parametr. public s t a t i c void main ( S t r i n g [ ] args ) {... / / args [ 0 ] = 1, args [ 1 ] = 9,... c 2006 2008 Michal Krátký Úvod do programovacích jazyků (Java) 39/39