Úvod do programovacích jazyků (Java) Michal Krátký Katedra informatiky VŠB Technická univerzita Ostrava Úvod do programovacích jazyků (Java), 2006/2007 c 2006 Michal Krátký Úvod do programovacích jazyků (Java) 1/26
1/2 jazyka Java (také překladová jednotka) má následující strukturu: deklarace package, deklarace import, deklarace typů. Pořadí těchto částí je závazné, každá část je nepovinná. Deklarace package má tvar: package name; kde name je (normativní) jméno balíčku. Deklarace import je posloupnost deklarací import (jednoduchých nebo on-demand). Deklarace typů je posloupnost definicí tříd a rozhraní. c 2006 Michal Krátký Úvod do programovacích jazyků (Java) 2/26
2/2 Pokud zdrojový soubor obsahuje veřejnou třídu nebo rozhraní jménem A, pak jméno zdrojového souboru musí být A.java. Pokud zdrojový soubor obsahuje třídu nebo rozhraní jménem A, které je odkazováno z jiného zdrojového souboru, pak jméno zdrojového souboru musí být A.java. Z těchto pravidel vyplývá, že soubor obsahuje nejvýše jednu třídu nebo rozhraní, která je veřejná nebo odkazována z jiného zdrojového souboru. Když jsou kompilovány zdrojové soubory, pak pro třídu nebo rozhraní A je vytvořen soubor A.class. Jména adresářů odpovídají jménům balíčků. c 2006 Michal Krátký Úvod do programovacích jazyků (Java) 3/26
Přístup ke členům třídy může být specifikován: public, protected, private nebo není specifikován (implicitní přístup default). public - přístupný z libovolné třídy, protected - přístupný z podtřídy a z jiné třídy stejného balíčku, default - přístupný z libovolné třídy stejného balíčku, private - přístupný pouze ve třídě, kde je člen definován. Při předefinování metody v podtřídě, musí být metoda deklarována se stejným nebo více volnějším přístupem než metoda v nadtřídě. c 2006 Michal Krátký Úvod do programovacích jazyků (Java) 4/26
1/7 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 Michal Krátký Úvod do programovacích jazyků (Java) 5/26
Proudy 2/7 Úvod do programovacích jazyků (Java), 9 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: Čtení: Otevření proudu. Dokud jsou v proudu data, čti. Uzavření proudu. c 2006 Michal Krátký Úvod do programovacích jazyků (Java) 6/26
Proudy 3/7 Úvod do programovacích jazyků (Java), 9 Zápis: Otevření proudu Dokud jsou data, zapisuj. Uzavření proudu c 2006 Michal Krátký Úvod do programovacích jazyků (Java) 7/26
Proudy 4/7 Úvod do programovacích jazyků (Java), 9 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 Michal Krátký Úvod do programovacích jazyků (Java) 8/26
Proudy, metody 5/7 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 Michal Krátký Úvod do programovacích jazyků (Java) 9/26
Proudy, metody 6/7 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 Michal Krátký Úvod do programovacích jazyků (Java) 10/26
Proudy, metody 7/7 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 Michal Krátký Úvod do programovacích jazyků (Java) 11/26
Souborové proudy 1/3 Souborové proudy čtou nebo zapisují do souborů na souborovém systému. FileInputStream FileOutputStream FileReader FileWriter c 2006 Michal Krátký Úvod do programovacích jazyků (Java) 12/26
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 Michal Krátký Úvod do programovacích jazyků (Java) 13/26
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 Michal Krátký Úvod do programovacích jazyků (Java) 14/26
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 Michal Krátký Úvod do programovacích jazyků (Java) 15/26
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 Michal Krátký Úvod do programovacích jazyků (Java) 16/26
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 Michal Krátký Úvod do programovacích jazyků (Java) 17/26
Další třídy Úvod do programovacích jazyků (Java), 9 Čtení a zápis primitivních datových typů DataInputStream, DataOutputStream. Náhodný přístup k datům RandomAccessFile. (PrintStream). BufferedInputStream, BufferedOutputStream. c 2006 Michal Krátký Úvod do programovacích jazyků (Java) 18/26
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 Michal Krátký Úvod do programovacích jazyků (Java) 19/26
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 Michal Krátký Úvod do programovacích jazyků (Java) 20/26
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 Michal Krátký Úvod do programovacích jazyků (Java) 21/26
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 Michal Krátký Úvod do programovacích jazyků (Java) 22/26
Příklad, StreamApp.java 1/4 package streamtest ; public class StreamApp DoubleArray mdoublearray ; public StreamApp ( ) mdoublearray = new DoubleArray ( 1 0 ) ; c 2006 Michal Krátký Úvod do programovacích jazyků (Java) 23/26
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 Michal Krátký Úvod do programovacích jazyků (Java) 24/26
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 Michal Krátký Úvod do programovacích jazyků (Java) 25/26
Příklad, StreamApp.java 4/4 S t r i n g s t r = " " ; i n t countofnumber = 0 ; 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 Michal Krátký Úvod do programovacích jazyků (Java) 26/26