Java tutorial Copyright á 2000-2001, Kozsik Tama s
A legelsoprogram Ü U dví zloszí veg kiıra sa a kepernyore class Hello { public static void main( String args[] ){ System.out.println("Hello World!"); } }
Be- es kimenet kezelese
Hogyan haszna ljunk fa jlokat? Ü Trivia lis megolda s: a szabva nyos bemenet/kimenet a tira nyıta sa val Ü Az opera ciüs rendszer szolga ltata sa Ü Az udví zloszí veget ki akarjuk ırni a hello.txt nev„ fa jlba: java Hello >hello.txt
Ha egy programban tí bb fa jl van Ü Akkor a programon belulrol is kellene tudni haszna lni oket Ü Van egy specia lis kí nyvta r erre a celra: a java.io csomag Ü Nem csak fa jlok kezelese, hanem a ltala ban bemenet es kimenet
Bemenet es kimenet absztrakciüja Ü Bemenet: konzol, fa jl, ha lüzati kapcsolat, adatba zis egy rekordja, stb. adatokat lehet egyma s uta n olvasni rüla Ü Kimenet: kepernyo, fa jl, nyomtatü, ha lüzati kapcsolat, adatba zis egy rekordja, stb. adatokat lehet egyma s uta n kiırni ra Ü ”Szekvencia lis input/output fa jl– Ü Csatorna (Stream) Ü Csatornaobjektumok
1 PDF created with FinePrint pdfFactory trial version http://www.fineprint.com
Mire kell ez? Ü Ugyanazokat a m„veleteket lehet haszna lni Ü Egy jül megszervezett kí nyvta r: java.io Ü Celok:
Java tutorial Copyright á 2000-2001, Kozsik Tama s
Ö egyszer„seg Ö rugalmassa g Ö kifejezoero
Ismet az a legelsoprogram
Ugyanaz fa jlba:
Ü U dví zloszí veg kiıra sa a kepernyore
Ü U dví zloszí veg kiıra sa egy fa jlba
class Hello { public static void main( String args[] ){ System.out.println("Hello World!"); } }
class Hello { public static void main( String args[] ){ System.out.println("Hello World!"); } }
Ugyanaz fa jlba:
Ugyanaz fa jlba:
Ü U dví zloszí veg kiıra sa egy fa jlba
Ü U dví zloszí veg kiıra sa egy fa jlba
class Hello { public static void main( String args[] ){ FileWriter fw = new FileWriter("a.txt"); System.out.println("Hello World!"); } }
class Hello { public static void main( String args[] ){ FileWriter fw = new FileWriter("a.txt"); PrintWriter pw = new PrintWriter(fw); System.out.println("Hello World!"); } }
2 PDF created with FinePrint pdfFactory trial version http://www.fineprint.com
Ugyanaz fa jlba:
Ugyanaz fa jlba:
Ü U dví zloszí veg kiıra sa egy fa jlba
Ü U dví zloszí veg kiıra sa egy fa jlba
class Hello { public static void main( String args[] ){ FileWriter fw = new FileWriter("a.txt"); PrintWriter pw = new PrintWriter(fw); System.out.println("Hello World!"); } }
class Hello { public static void main( String args[] ){ FileWriter fw = new FileWriter("a.txt"); PrintWriter pw = new PrintWriter(fw); pw.println("Hello World!"); } }
Ugyanaz fa jlba:
Ugyanaz fa jlba:
Ü U dví zloszí veg kiıra sa egy fa jlba
Ü U dví zloszí veg kiıra sa egy fa jlba
class Hello { public static void main( String args[] ){ FileWriter fw = new FileWriter("a.txt"); PrintWriter pw = new PrintWriter(fw); pw.println("Hello World!"); pw.close(); } }
import java.io.*; class Hello { public static void main( String args[] ){ FileWriter fw = new FileWriter("a.txt"); PrintWriter pw = new PrintWriter(fw); pw.println("Hello World!"); pw.close(); } }
Ugyanaz fa jlba: Ü U dví zloszí veg kiıra sa egy fa jlba import java.io.*; class Hello { public static void main( String args[] ) throws IOException { FileWriter fw = new FileWriter("a.txt"); PrintWriter pw = new PrintWriter(fw); pw.println("Hello World!"); pw.close(); } }
Java tutorial Copyright á 2000-2001, Kozsik Tama s
3 PDF created with FinePrint pdfFactory trial version http://www.fineprint.com
Ugyanaz fa jlba:
Ugyanaz fa jlba:
Ü U dví zloszí veg kiıra sa egy fa jlba
Ü U dví zloszí veg kiıra sa egy fa jlba
import java.io.*; class Hello { public static void main( String args[] ) throws IOException { FileWriter fw = new FileWriter("a.txt"); PrintWriter pw = new PrintWriter(fw); pw.println("Hello World!"); pw.close(); } }
import java.io.*; class Hello { public static void main( String args[] ) throws IOException { FileWriter fw = new FileWriter("a.txt"); PrintWriter pw = new PrintWriter(fw); pw.println("Hello World!"); pw.close(); } }
System.out Java tutorial Copyright á 2000-2001, Kozsik Tama s
Ü Ez egy predefinit csatorna Ü Szabva nyos kimenet Ü PrintStream Ö van neki println() m„velete Ö olyasmi, mint a PrintWriter
Ü Van meg System.in es System.err is System.out.println("Hello");
A java.io csomag tartalma Ü Sok pici oszta ly Ü Mindegyik egy kis funkcionalita st valüsıt meg Ü Kí nnyen kompona lhatük Ü Van neha ny nagyon fontos oszta ly, a tí bbi ma r haladüknak valü... :-)
Az oszta lyok rendszerezese Ü Kulí nbí zoszempontok szerint csoportosıthatjuk az oszta lyokat Ü Szimmetria Ü Az oszta lyok neve sokat ela rul Ö A nevek nevkomponensekbol epulnek fel, amelyek segıtik az oszta ly hovatartoza sa nak mega llapıta sa t
Ü Az oszta lyok hierarchia ja is kí veti a logikai tagola st
4 PDF created with FinePrint pdfFactory trial version http://www.fineprint.com
Az oszta lyok csoportosıta sa Ü Ha rom szempont szerint lehet 1. ira ny
Java tutorial
Ü bemenet Ü kimenet
2. funkciü Ü ta rola s müdja nak specifika la sa Ü extra funkcionalita s hozzaada sa
Copyright á 2000-2001, Kozsik Tama s
3. szervezes Ü ba jt Ü karakter
1. A csatorna k ira nya Ü Lehet bemeneti es kimeneti Ü Bemeneti: amirol olvasni lehet InputStream, Reader Ü Kimeneti: amire ırni lehet OutputStream, Writer Ü Szimmetria: pelda ul FileInputStream, FileReader, FileOutputStream, FileWriter
2a. A ta rola s müdja nak specifika la sa Ü Honnan olvassuk az adatokat, vagy hova ırjuk azokat Ü FileReader, CharArrayReader, StringReader, PipedReader Ü C-ben: scanf, fscanf, sscanf
2. A csatornaoszta lyok funkciüja 2a. A ta rola s müdja nak specifika la sa Ö hol vannak az adatok Ö pl. FileWriter (fa jlban)
2b. Extra funkcionalita s hozza ada sa Ö hogyan szeretnenk piszka lni az adatokat Ö pl. PrintWriter (println() metüdussal)
2b. Extra funkcionalita s hozza ada sa Ü Bonyolultabb m„veletek kulí n oszta lyban Ü O nmagukban egyszer„ek Ü Kompona lhatük Ü Szu rok
Ü Szabva nyos m„veletek minima lis funkcionalita st biztosıtanak
Ü Pelda ul a PrintWriter, BufferedReader, stb.
5 PDF created with FinePrint pdfFactory trial version http://www.fineprint.com
3. Az adatok szervezese Ü Ba jtszervezes„ Ö A kulí nbí zokarakterküdola si szabva nyok figyelmen kıvul hagya sa Ö Input- vagy OutputStream
3. Az adatok szervezese Ü A karakterküdola si szabva nyok: Ö ASCII (7 bit) Ö extended ASCII, EBCDIC, ISO Latin-1, ISO Latin-2, Windows Latin-*, Mac, IBM, stb. (1 ba jt) Ö Java: Unicode (2 ba jt)
Ö A kulí nbí zokarakterküdola si szabva nyokbül sza rmazü elteresek kezelese Ö Reader vagy Writer
Ü Hordozhatüsa g, i18n, elosztott alkalmaza sok: a szabva nyok explicit kezelese Ü Java 1.1-tol Ü Sok regi oszta ly/m„velet elavult (deprecated)
Karakterszervezes„ csatorna k
Csatornaoszta lyok
Ü Karakterszervezes„
Ü Java ban a karakterek (char, String) ket ba jtosak Ü Az opera ciüs rendszerek es a nem Java alkalmaza sok tí bbsegeben csak egy ba jtosak (pl. szí vegfa jlok) Ü Hogyan lehet a lekepezest megadni a ketto kí zí tt?
Ü A csatornaoszta lyok hierarchia ja es elnevezese kí veti a rendszert Ü Kí nnyen kitala lhatü, hogy melyik oszta ly mire valü Ü Negy ba zisoszta ly, es a tí bbi ezeknek a lesza rmazottja
Ö Karakterküdola si szabva nyok
A negy ba zisoszta ly Ü InputStream
Java tutorial
Ö bemeneti ba jtcsatorna
Ü OutputStream Copyright á 2000-2001, Kozsik Tama s
Ö kimeneti ba jtcsatorna
Ü Reader Ö bemeneti karaktercsatorna
Ü Writer Ö kimeneti karaktercsatorna
6 PDF created with FinePrint pdfFactory trial version http://www.fineprint.com
Lesza rmazottak Ü A nev tukrí zi, hogy melyikbol Ü Szimmetria Ü FileInputStream, FileOutputStream, FileReader, FileWriter Ü BufferedInputStream, BufferedOutputStream, BufferedReader, BufferedWriter Ü ByteArrayInputStream, ByteArrayOutputStream, CharArrayReader, CharArrayWriter
Alapfunkcionalita s Ü A negy ba zisoszta lyban van specifika lva Ü Ez a negy oszta ly absztrakt Ü A lesza rmazottak valüsıtja k meg a funkcionalita st Ü Pl. a FileInputStream egy olyan InputStream, ami az alap csatornafunkcionalita st fa jlokon valüsıtja meg
Kimeneti csatorna k Ü Ü Ü Ü
Csatorna megnyita sa Csatorna leza ra sa Ira s a csatorna ra Buffer urıtese (flush-ola s)
Java tutorial Copyright á 2000-2001, Kozsik Tama s
Bemeneti csatorna k Ü Csatorna megnyita sa Ü Csatorna leza ra sa Ü Olvasa s a csatorna rül Ü Csatorna n tala lhatü adatok mennyisegenek lekerdezese Ü Kí nyvjelzomechanizmus
Csatorna k megnyita sa Ü A megfelelooszta lyŐ csatorna objektum letrehoza sa val Ü Ezen az objektumon vegezhetok el a tova bbi csatornam„veletek FileInputStream fin = new FileInputStream("a.txt"); InputStream fin = new FileInputStream("a.txt");
7 PDF created with FinePrint pdfFactory trial version http://www.fineprint.com
Csatorna k beza ra sa Ü A close() m„velet segıtsegevel Ü Ne felejtsuk el! Foleg kimenet csatorna kna l fontos: maga ban foglalja a bufferelt adatok tenyleges kiıra sa t (flush) is. fin.close();
Pelda import java.io.*; class IOProba { public static void main( String args[] ) throws IOException { InputStream fin = new FileInputStream("a.txt"); OutputStream fout = new FileOutputStream("b.txt"); /* itt most csinalhatnek valamit... */ fin.close(); fout.close(); } }
Beolvasa s Java tutorial Copyright á 2000-2001, Kozsik Tama s
read()-ek: InputStream Ü Egy adat beolvasa sa int read() throws IOException
Ö egy ba jtot beolvas; -1, ha vege
Ü Egy tí mbnyi adat beolvasa sa int read( byte[] b ) throws IOException
Ö olvas b-be; visszaadja a beolvasott ba jtok sza ma t
Ü Egy resztí mbnyi adat beolvasa sa int read( byte[] b, int off, int len ) throws IOException
Ö off-tül len hosszan olvas
Ü read() m„veletek segıtsegevel Ü Majdnem ugyanaz InputStream-ek es Reader-ek eseten Ü ha romfajta read() m„velet
read()-ek: Reader – int read() throws IOException – int read( char[] c ) throws IOException – int read( char[] c, int off, int len ) throws IOException – int read() throws IOException – int read( byte[] b ) throws IOException – int read( byte[] b, int off, int len ) throws IOException
Ü Ugyanaz, csak byte[] helyett char[]
8 PDF created with FinePrint pdfFactory trial version http://www.fineprint.com
Kiıra s Java tutorial Copyright á 2000-2001, Kozsik Tama s
Ü write() m„veletek segıtsegevel Ü Majdnem ugyanaz OutputStream-ek es Writer-ek eseten Ü Szimmetrikus a beolvasü read() m„veletekkel Ü ha romfajta alap write() m„velet Ö plussz meg egy kis kiegeszıtes
write()-ok: OutputStream Ü Egy adat kiıra sa
write()-ok: Writer
void write( int i ) throws IOException
Ö az i-nek a legalsü ba jtja t ırja ki int read() throws IOException
Ü Egy tí mbnyi adat kiıra sa
– void write( int i ) throws IOException – void write( char[] c ) throws IOException – void write( char[] c, int off, int len ) throws IOException
void write( byte[] b ) throws IOException int read( byte[] b ) throws IOException
Ü Egy resztí mbnyi adat kiıra sa void write( byte[] b, int off, int len ) throws IOException int read( byte[] b, int off, int len ) throws IOException
write()-ok: Writer – void write( int i ) throws IOException
Ö az i legalsü ket ba jtja t ırja ki – void write( char[] c ) throws IOException – void write( char[] c, int off, int len ) throws IOException
write()-ok: Writer – void write( int i ) throws IOException – void write( char[] c ) throws IOException – void write( char[] c, int off, int len ) throws IOException – void write( String s ) throws IOException – void write( String s, int off, int len ) throws IOException
9 PDF created with FinePrint pdfFactory trial version http://www.fineprint.com
Pelda: ma sola s static void masol ( InputStream in, OutputStream out ) throws IOException { int b; while( (b=in.read()) != -1 ) out.write(b); out.flush(); }
Feladat Ü Adott ket fa jl, "a.txt" es "b.txt". Fesuljuk í ssze a ket fa jl tartalma t a "c.txt" fa jlba. Eloszí r egy ba jt az "a.txt"-bol, azta n egy a "b.txt"-bol, azta n megint egy az "a.txt"-bol, stb. Ha valamelyik fa jl vegeter, a ma sik fa jl maradeka t ma soljuk a "c.txt" vegere.
O sszerakva: import java.io.*; class cp { public static void main( String args[] ) throws IOException { InputStream fin = new FileInputStream(args[0]); OutputStream fout = new FileOutputStream(args[1]); masol(fin,fout); fin.close(); fout.close(); } static void masol(...) ... {...} }
Visszaterve meg egy percre... static void masol ( InputStream in, OutputStream out ) throws IOException { int b; while( (b=in.read()) != -1 ) out.write(b); out.flush(); }
Ü Buffer urıtese: az adatok tenylegesen kiırüdjanak a fizikai adathordozüra
Ma sola s tí mbbel static int BlokkMeret = 100;
Java tutorial Copyright á 2000-2001, Kozsik Tama s
public static void masolBlokkonkent ( InputStream in, OutputStream out ) throws IOException { byte[] b = new byte[BlokkMeret]; int hossz; while( (hossz=in.read(b)) == BlokkMeret ) out.write(b); if( hossz != -1 ) out.write(b,0,hossz); out.flush(); }
Ü egyszerre 100 ba jtot ma solunk a t
10 PDF created with FinePrint pdfFactory trial version http://www.fineprint.com
Feladat Ü Az elozofeladatra adott megolda st müdosıtsd Ő gy, hogy az a.txt es a b.txt fa jlokbül 10 ba jtos blokkokat ma soljon a c.txt fa jlba!
Veget ert es ures csatorna k Ü Ket teljesen kulí nbí zodolog! Ü Veget ert: ha ures, es ures is marad. Ü U res: lehet, hogy meg nem ert veget, csak eppen nem erkezett meg meg az adat Ü Gondoljunk egy ha lüzati kapcsolatra Ö Pl. a szerver va rja, hogy a kliens kuldjí n adatot
Java tutorial Copyright á 2000-2001, Kozsik Tama s
Mi a kulí nbseg a beolvasü m„veletek sza ma ra? Ü Ha veget ert egy csatorna, a beolvasa s befejezodik, es a visszateresi ertek jelzi, hogy nincs tí bb adat. Ö elsoread: -1 a visszateresi ertek Ö ma sik ket read: a beolvasott adatok sza ma t adja vissza
Ü Ha ures a csatorna, a beolvasü m„velet blokkol´ dik, va rja, hogy erkezzen adat. Ö a vegrehajta si sza l felfuggesztodik, nem fut tova bb
Pelda k Ü Veget ert csatorna: az elozopelda kban a ciklusbül kileptunk, amikor vegetert a bemenet Ü Blokkolt beolvasa s: a program va r, amıg be nem ırunk egy sort. Ekkor a shell odateszi az adatokat a program szabva nyos bemenetere. public static void main( String args[] ) throws IOException { int i = System.in.read(); System.out.write(i); System.out.flush(); }
Kulí nbseg a write es a print kí zí tt public static void main( String args[] ) throws IOException { int i = System.in.read(); System.out.write(i); System.out.println(" " + i); }
Ü Kiırjuk a beolvasott bet„t (ba jtot) Ő gy, ahogy beolvastuk, majd uta na a küdja t. Ü print: kinyomtata s szí veges forma ban
11 PDF created with FinePrint pdfFactory trial version http://www.fineprint.com
Mi van meg a fa jlokon kıvul? Ü Csatorna k segıtsegevel nem csak fa jlokbül lehet olvasni, es fa jlokba ırni. Ü Memüria, ha lüzati kapcsolat, nyomtatü, stb. Ü Mindezekrol kicsit kesobb ejtunk majd szüt...
Csatorna k feladat szerinti csoportosıta sa Ü Alapfunkcionalita s megvalüsıta sa kulí nbí zoadathordozükon (pl. fa jlokon) Ü Extra funkcionalita ssal val´ella ta s: szu rok
Sz„rok Java tutorial Copyright á 2000-2001, Kozsik Tama s Kimeneti csatorna, pl. egy fajl
Sz„rok
Egy sz„ron keresztul ırunk, ami extra funkcionalita st biztosıt (pl. buffereles)
Sz„rok
A sz„rois egy csatorna, amit egy Ő jabb sz„rovel la thatunk el. Kompona lhatjuk a sz„roket, hogy bonyolultabb viselkedest a llıthassunk elo. (Pl. buffereles es print-eles egyszerre)
12 PDF created with FinePrint pdfFactory trial version http://www.fineprint.com
Sz„rok
Szühaszna lat Ü A sz„roket mindig egy ma r meglevo csatorna f¨ le hozzuk letre. Ü A sz„rocsatorna konstruktora nak parameterkent meg kell adni a sz„rt csatorna t FileWriter fw = new FileWriter("a.txt"); PrintWriter pw = new PrintWriter(fw);
A sz„ro(ke)t megkerulve is ırhatunk a kulsocsatorna ra, de ez elegge veszelyes. (Gondoljunk pl. arra, hogy a sz„roa buffereles...)
vagy
aja nlott hozzaferes Ma sodik sz„ro Elsosz„ro Sz„rt csatorna
A legfontosabb sz„rok Ü Buffereles Ü Adattıpus-ertekek beolvasa sa es kiıra sa
Java tutorial Copyright á 2000-2001, Kozsik Tama s
Ü Szí veges forma ban tí rtenokiıra s (”nyomtata s–)
Az elsopelda nk volt: szí veges kiıra s fa jlba
Az elsopelda nk volt: szí veges kiıra s fa jlba
import java.io.*; class Hello { public static void main( String args[] ) throws IOException { FileWriter fw = new FileWriter("a.txt"); PrintWriter pw = new PrintWriter(fw); pw.println("Hello World!"); pw.close(); } }
import java.io.*; class Hello { public static void main( String args[] ) throws IOException { FileWriter fw = new FileWriter("a.txt"); PrintWriter pw = new PrintWriter(fw); pw.println("Hello World!"); pw.close(); } }
A FileWriter objektumnak nincs println mu velete!
A szu ro konstruktora nak a tadjuk fw-t!
13 PDF created with FinePrint pdfFactory trial version http://www.fineprint.com
Az elsopelda nk volt: szí veges kiıra s fa jlba
Az elsopelda nk volt: szí veges kiıra s fa jlba
import java.io.*; class Hello { public static void main( String args[] ) throws IOException { FileWriter fw = new FileWriter("a.txt"); PrintWriter pw = new PrintWriter(fw); pw.println(42*Integer.parseInt(args[0])); pw.close(); } }
import java.io.*; class Hello { public static void main( String args[] ) throws IOException { FileWriter fw = new FileWriter("a.txt"); PrintWriter pw = new PrintWriter(fw); pw.println(args.length > 0); pw.close(); } }
Egy PrintWriter szu rovel kinyomtathatunk sza mokat!
Vagy logikai ertekeket, stb.
Szí veges kiıra s Ü Ü Ü Ü
PrintStream es PrintWriter Nevezetesek a System.out es System.err Persze nem csak fa jlok fí le hozhatjuk letre... Kinyomtathatunk adattıpus-ertekeket is, es objektumokat is Ö a toString() metüduson keresztul Ü print: sima kinyomtata s println: mint print, plussz soremeles
Java tutorial Copyright á 2000-2001, Kozsik Tama s
System.out.print(42); System.out.print("42");
Bina ris kiıra s Ü DataOutputStream Ü Adattıpus-ertekek bina ris kiıra sa Ö Ha nem egyszer„en ba jtokat szeretnenk kiırni... Ö Pl. kiırhatjuk egyszerre mind a negy ba jtot, ami egy float tıpusŐ ertekhez kell FileOutputStream fout = new FileOutputStream("a.dat"); DataOutputStream dout = new DataOutputStream(fout); dout.writeFloat((float)12.0);
Bina ris beolvasa s Ü DataInputStream Ü Ugyanaz visszafele is megy: beolvasunk negy ba jtot, es rekonstrua ljuk belole a float tıpusŐ erteket DataInputStream din = new DataInputStream( new FileInputStream("a.dat") ); float f = din.readFloat();
14 PDF created with FinePrint pdfFactory trial version http://www.fineprint.com
Lehetosegek Ü Ü Ü Ü Ü Ü Ü Ü
writeBoolean writeByte writeShort writeChar writeInt writeLong writeFloat writeDouble
Ü writeUTF
Ü Ü Ü Ü Ü Ü Ü Ü
readBoolean readByte readShort readChar readInt readLong readFloat readDouble
Ü readUTF
Mire jü ez? Ü Adatok tí mí r ta rola sa t teszi lehetove a bina ris forma tum Ü A DataOutputStream es a DataInputStream segıtsegevel egyszer„en lehet adattıpusertekeket elmenteni es visszaolvasni Ü Platform-fuggetlen megolda s: a bina ris forma tumot a Java pontosan specifika lja (big-endian vs. little-endian problema)
Feladat Java tutorial Copyright á 2000-2001, Kozsik Tama s
Ü A ma trix oszta lyt egeszıtsuk ki bina ris elmentoes beolvasü m„veletekkel. Ü Irjunk hozza toString() metüdust is, hogy megkí nnyıtsuk a kepernyore valü kiıra st. Ü Irjunk egy foprogramot, ami elment egy egysegma trixot. Ü Irjunk egy ma sik foprogramot, ami egy fa jlbül beolvasott ma trixhoz hozza adja a csupa egyes ma trixot, es visszaırja a fa jlba.
Kulí nbseg a szí veges es a bina ris forma tum kí zí tt
Kerdes Ü Melyik ha ny ba jtot ır ki? á dout.writeInt(12) á pout.print(12)
FileOutputStream fout = new FileOutputStream("okos.txt"); DataOutputStream dout = new DataOutputStream(fout); PrintStream pout = new PrintStream(fout); fout dout
pout
15 PDF created with FinePrint pdfFactory trial version http://www.fineprint.com
Kulí nbseg a szí veges es a bina ris forma tum kí zí tt FileOutputStream fout = new FileOutputStream("okos.txt"); DataOutputStream dout = new DataOutputStream(fout); PrintStream pout = new PrintStream(fout); dout.writeInt( 1869311859); dout.flush(); pout.print( 1869311859); pout.flush(); fout.write( 1869311859); fout.flush();
Ü A sza mok tí bbsegenel tenyleg tí mí rebb a bina ris forma...
Buffereles
Ü DataInputStream - DataOutputStream beolvasa s - kiıra s Ü ??? - PrintStream/PrintWriter Ü Nincs olyan csatornaoszta ly, aminek a segıtsegevel egyszer„en lehetne szí veges forma tumban elmentett adattıpus-ertekeket visszaolvasni Ü Megolda s: BufferedReader - mindja rt... Ü Ma sik: StreamTokenizer (haladü...)
Feladat
Ü BufferedInputStream, BufferedReader BufferedOutputStream, BufferedWriter Ü Ezek a csatorna k bufferelnek Ü Jü esetben az oprendszer is bufferel... InputStream bin = new BufferedInputStream( new FileInputStream("a.txt")
PrintStream inverze?
Ü Ja tsszuk ki a bufferelest! Irjunk olyan programot, ami í sszevissza ır egy fa jlba.
);
Sz„rok kompona la sa Ü A bufferelest gyakran haszna ljuk egyeb sz„rovel egyutt, pl. Data*Stream FileInputStream fin = new FileInputStream(tavoli_fajl); BufferedInputStream bin = new BufferedInputStream(fin); DataInputStream din = new DataInputStream(bin); float ¨sszeg = 0.0F; for( int i=0; i<100; i++ ) ¨sszeg += din.readFloat(); }
Java tutorial Copyright á 2000-2001, Kozsik Tama s
16 PDF created with FinePrint pdfFactory trial version http://www.fineprint.com
Pelda Interaktıv alfanumerikus program
Meg egy fontos dolog... Ü BufferedReader Ü Sorok olvasa sa szí veges a lloma nybül Ü A metüdus: String readLine() throws IOException
Ü Soremelesig olvas, a soremeles jelet nem adja vissza Ö Soremeles jel:
\r
\n
\r\n
Ü Csatorna vege eseten: null
public static void main( String args[] ) throws IOException { BufferedReader r = new BufferedReader( new InputStreamReader(System.in)); System.out.println("Uss¨n be egy szamot: "); String s = r.readLine(); int n = Integer.parseInt(s); System.out.println("A szam negyzete: " + n*n); }
Feladat Ü Irjunk olyan metüdust a ma trix oszta lyhoz, amelynek segıtsegevel szí veges forma tumbül be lehet olvasni egy ma trixot. A ma trix elemei mind kulí n sorban legyenek! Ü Haszna lj BufferedReader oszta lyt egy FileReader fí le hŐ zva!
Java tutorial Copyright á 2000-2001, Kozsik Tama s
Pelda Kí zvetlen eleres„ fa jlok Ü Ü Ü Ü
Sokan szeretnek pozıciona lni egy fa jlban... Ez nem megy a csatornaoszta lyok eseten RandomAccessFile Meg lehet nyitni egy fa jlt, es lehet olvasni ("r") vagy ırni/olvasni ("rw") Ü M„veletek: mint DataInputStream es DataOutputStream, de egyutt
Ü Minden ha romhatva nyadik sza mot inkrementa lunk. RandomAccessFile f = new RandomAccessFile("adatok.dat","rw"); int haromhatvany = 1; while( haromhatvany * 4 < f.length() ){ f.seek(haromhatvany * 4); int adat = f.readInt(); f.seek(haromhatvany * 4); f.writeInt(adat+1); haromhatvany *= 3; } f.close();
17 PDF created with FinePrint pdfFactory trial version http://www.fineprint.com
Feladat Ü Indexelt fa jlkezeles Ü Az indexelt fa jl 1024 hosszŐ sa gŐ , double ertekeket tartalmazü sorozatokat tartalmaz. Ü Az indexeleshez haszna ljunk lexikografikus rendezest.
Java tutorial Copyright á 2000-2001, Kozsik Tama s
Mik vannak meg a fa jlokon kıvul?
Haladü kurzushoz
Mik vannak meg a fa jlokon kıvul? Ü A feladat szerinti csoportosıta s szerint: honnan olvasunk, illetve hova ırunk Ü Lehetosegek a java.io csomagban Ö Ö Ö Ö Ö
fa jlok csí vek ba jt- es karaktertí mbí k, sztringek ba jtcsatorna felett definia lt karaktercsatorna k í sszef„zí tt csatorna k
Ü A feladat szerinti csoportosıta s szerint: honnan olvasunk, illetve hova ırunk Ü Lehetosegek a java.io csomagban Ö Ö Ö Ö Ö
fa jlok csí vek ba jt- es karaktertí mbí k, sztringek ba jtcsatorna felett definia lt karaktercsatorna k í sszef„zí tt csatorna k
Csí vek Ü Egy PipedInputStream-et es egy PipedOutputStream-et í sszekapcsolhatunk egyma ssal. Ü Amit a pout-ra ırunk, megjelenik az pin-en. Ü Mire jük? Konkurrens vegrehajta si sza lak egyma s kí zí tti kommunika ciüja ra, pl. Ü Kesobb lesz rüluk bovebben szü.
18 PDF created with FinePrint pdfFactory trial version http://www.fineprint.com
Memüria m„veletek Ü Az adatok, amiket vegigolvasunk, vagy amiket kiırunk, egy memüriacımtol kezdve, folytonosan helyezkednek el Ü Pelda ul egy ba jttí mbben Ö ByteArrayInputStream, -OutputStream
Ü Vagy esetleg egy karaktertí mbben Ö CharArrayReader, -Writer
Ü Vagy egy sztringben Ö StringReader, -Writer Ö StringBufferInputStream
Ba jtcsatorna k felett definia lt karaktercsatorna k Ü Kapcsolat a ketfele szervezes„ csatornaoszta lyok kí zí tt Ü A kulí nbí zokarakterküdola si szabva nyok ta mogata sa Ü InputStreamReader, OutputStreamWriter Ü Specifika lhatjuk, hogy melyik karakter melyik ba jtra legyen lekepezve
Karaktertí mbbol olvasunk char[] t = {'r', 'o', 'k', 'a'}; CharArrayReader in = new CharArrayReader(t); t[0] = 'f'; System.out.println(in.read()=='f');
"true"-t fog kiırni
Karakterek lekepezese ba jtokra Ü Egy byte tıpusŐ ertek 256-fele lehet Ü Karakterbol jüval tí bbfele van Ü Karakterküdola si szabva ny: mely karaktereket reprezenta lja ez a 256 kulí nbí zoertek Ü Pelda ul a Unicode karakterek ketba jtosak Ö a char tıpus
Karakterküdola si szabva nyok Ü Ü Ü Ü Ü Ü
ASCII - 7 bit Extended ASCII - 8 bit EBCDIC Latin-1, Latin-2 Windows-os küdta bla k Mac-es küdta bla k
Java tutorial Copyright á 2000-2001, Kozsik Tama s
19 PDF created with FinePrint pdfFactory trial version http://www.fineprint.com
Pelda
Writer w = new OutputStreamWriter(System.out,"8859_2"); w.write(336); w.flush(); System.out.write(336);
Ü 8859_2 ISO Latin-2 Ü A 336 Unicode küdŐ karakter az "Ű " Ü A Latin-2 tartalmazza ezt a karaktert, a 256 lehetseges ertek kí zul a 213 van hozza rendelve Ü Teha t a System.out-ra a 213 ba jt fog kiırüdni Ü Platform-fuggo, hogy mit fogunk la tni
ISO Latin-1 Ü Az ISO Latin-1 küdola sban szereplo karakterek a Nyugat-Eurüpa ban haszna latos bet„ket (is) tartalmazza k Ü Ezen karakterekhez az ISO Latin-1 ugyanazokat a sza mokat rendeli, mint a Unicode. Azaz: a Unicode küdta bla elso 256 karaktere ugyanaz, mint a Latin-1 Ü Azaz a hulla mos O bet„ Unicode küdja is 213
Ö Pl. Latin-1 kepernyoeseten "O" karaktert
ISO Latin-2 Ü Tartalmazza azokat a bet„ket is, amelyeket csak mifelenk haszna lnak, nevezetesen az o, „, Ű es Ú bet„ket Ü Az elobbi pelda ban: a 336 Unicode küdŐ karaktert, az Ű -t, es a 213 ertekkel kapcsolja í ssze Ü Ez a karakter nincs az ISO Latin-1 küdta bla ban, abban a hulla mos va ltozat van a 213 ertekhez kapcsolva
Pelda Writer w = new OutputStreamWriter(System.out,"8859_1"); w.write("tekn\u0150c"); w.close();
Ü A \u0150 karakter a 336-os, azaz az Ű bet„ Ü Ez nincs a Latin-1-ben (8859_1) Ü A kimeneten a ? karakternek megfeleloba jt ırüdik ki helyette – tekn?c
Ma sik pelda
Java tutorial Copyright á 2000-2001, Kozsik Tama s
Writer w = new OutputStreamWriter(os,"MacCentralEurope"); w.write('í'); w.flush(); // w.write(218); Reader r = new InputStreamReader(is,"Cp1250"); int i = r.read(); System.out.println(i); // 328 jelenik meg
Ü A 218 Unicode küd az É bet„ Ü A MacCentralEurope a 242 küdot rendeli hozza Ü A Windows Latin-2 (azaz a Cp1250) a 328 Unicode küdŐ karaktert rendeli a 242 ertekhez Ü Ez a n bet„
20 PDF created with FinePrint pdfFactory trial version http://www.fineprint.com
A Java a ltal ta mogatott karakterküdola si szabva nyok
Tanulsa g Ü Ugyanazzal a karakterküdola ssal erdemes beolvasni, mint amivel kiırtuk az adatokat Ü Ha a Java programunk ma s programmal / ma s platformmal tartja a kapcsolatot, akkor is jül megy Ü Ez a szaba ly platformfuggetlenseget is biztosıt Ü Ket Java program kí zí tti kommunika ciüna l is fontos (p. ha lüzatos program)
Ü Ü Ü Ü Ü
ISO Latin-1, ISO Latin-2, ... Windows Latin-1, ... Mac küdola sok IBM küdta bla k Ta vol-keleti szabva nyok (Big5, JIS, stb.)
Ü Mindnek megfelel egy sztring, amit a konstruktornak kell a tadni. Pl. "8859_1"
Karakterszervezes„ fa jlcsatorna k – Reader fr = new FileReader("olvass.el"); – Reader fr = new InputStreamReader( new FileInputStream("olvass.el") ); – Reader fr = new InputStreamReader( new FileInputStream("olvass.el"), "8859_2");
Java tutorial Copyright á 2000-2001, Kozsik Tama s
Pelda k Csatorna k egyma s uta n f„zese Ü SequenceInputStream Ü A konstruktora nak megadunk tí bb InputStream-et Ü Ezeket egyma s uta n vegigolvashatjuk: ha az egyik veget er, automatikusan ugrik a kí vetkezore
InputStream in = new SequenceInputStream( (new FileInputStream("papsajt")), System.in ); Vector v = new Vector(2); v.addElement(new FileInputStream("papsajt")); v.addElement(System.in); InputStream in = new SequenceInputStream(v.elements());
Ü Vegigolvashatjuk a "papsajt" fa jlt, es folytatjuk az olvasa st a szabva nyos bemenetrol
21 PDF created with FinePrint pdfFactory trial version http://www.fineprint.com
Mibol lehet meg olvasni, mire lehet meg ırni? Java tutorial Copyright á 2000-2001, Kozsik Tama s
Kiegeszıtesek az alapfunkcionalita shoz Ü A ket bemeneti csatorna alaposzta lynak, az InputStream-nek es a Reader-nek tova bbi "szolga ltata sai" Ü Kí nyvjelzomechanizmus Ü Adatelerhetoseg-vizsga lat
Ü Ma s kí nyvta rakban is vannak olyan oszta lyok, metüdusok, amelyek segıtsegevel csatorna khoz juthatunk hozza Ü Pelda ul a java.net.Socket oszta lytül tudunk olyan bemeneti es kimeneti csatorna kat beszerezni, amivel ha lüzati kapcsolaton keresztul lehet irka lni, olvasgatni...
Adatelerhetoseg-vizsga lat Ü InputStream: Ü Reader:
int available() boolean ready()
Ü Meg lehet tudni, hogy a beolvasa s blokkolüdni fog-e. Az available csak becslest ad! public static int meret( String fnev ) throws IOException { return (new FileInputStream(fnev)).available(); }
Kí nyvjelzomechanizmus
Kí nyvjelzomechanizmus
void mark(int readlimit) throws IOException boolean markSupported() void reset() throws IOException
void mark(int readlimit) throws IOException boolean markSupported() void reset() throws IOException
Ü Betehetek egy kí nyvjelzot az aktua lis pozıciüra Ü ... amennyiben a csatornaoszta ly ta mogatja ... Ü Visszaugrok a kí nyvjelzoig
Ü Betehetek egy kí nyvjelzot az aktua lis pozıciüra Ö Ha visszaugrok a reset-tel, akkor innen kezdve megint elolvashatom a csatorna tartalma t Ö A mark es a reset kí zí tt max. "readlimit" ba jtot olvashatok a t...
22 PDF created with FinePrint pdfFactory trial version http://www.fineprint.com
Kí nyvjelzomechanizmus void mark(int readlimit) throws IOException boolean markSupported() void reset() throws IOException
Ü Jüneha ny csatornaoszta ly ta mogatja a kí nyvjelzomechanizmust, de jü sok nem
Pelda public static void ketszer ( ByteArrayInputStream in ) throws IOException { int c; in.mark(in.available()); while( (c=in.read()) != -1 ) System.out.println(c); in.reset(); // meg egyszer ırjuk ki ugyanazt while( (c=in.read()) != -1 ) System.out.println(c); }
Extra funkcionalita s: sz„rok Java tutorial Copyright á 2000-2001, Kozsik Tama s
Ü Ma r beszeltunk ezekrol: Ö buffereles Ö adattıpus-ertekek Ö szí veges ”nyomtata s–
Ü Tova bbiakat fogunk megismerni...
Meg mielott ra ternenk... Ü DataInputStream String readUTF()
DataOutputStream void writeUTF(String s)
Ü PrintStream, PrintWriter kivetelek
DataInputStream String readUTF()
DataOutputStream void writeUTF(String s)
Ü Unicode sztringek elmentese es visszaolvasa sa Ü Platformfuggetlen Ö Ő n. UTF-8 forma tumban
Ü Informa ciüvesztes nelkul Ö ugyanis a karakterszervezes„ csatorna k csak a nekik megfelelokarakterküdola si szabva ny szerinti karaktereket tudja k
23 PDF created with FinePrint pdfFactory trial version http://www.fineprint.com
Feladat Ü Irjunk ki fa jlba sztringeket es karaktertí mbí ket az í sszes a ltalunk ismert müdon. Ü Derıtsuk fel a kulí nbsegeket!
Extra funkcionalita s: tova bbi sz„rok Ü bemenet sorainak sza mola sa Ü adat visszatevese Ü objektumok beolvasa sa / kiıra sa Ü tí mí rıtes Ü stb.
PrintStream, PrintWriter: kivetelek Ü A m„veletek nem va ltanak ki IOException kivetelt gond eseten Ü Helyette egy error-flag-et a llıtanak – boolean checkError()
A bemenet sorainak sza mola sa Ü LineNumberReader, LineNumberInputStream LineNumberReader be = new LineNumberReader( new FileReader("borok.txt") ); String sor; while( (sor = be.readLine()) != null ){ if( sor.endsWith("bor") ) System.out.println(be.getLineNumber()-1); } be.close();
Adat visszatevese a bemeneti csatorna ra Ü PushbackReader, PushbackInputStream PushbackReader be = new PushbackReader( new InputStreamReader(System.in), 2 ); int c = be.read(); while( (c == ' ') || (c == '\t') || (c == '\r') || (c == '\n') ) c = be.read(); if( c != -1 ){ be.unread(c); be.unread(' '); }
Java tutorial Copyright á 2000-2001, Kozsik Tama s
24 PDF created with FinePrint pdfFactory trial version http://www.fineprint.com
Objektumok ta rola sa
Objektumok ta rola sa
Ü ObjectInputStream, ObjectOutputStream Ü kiterjesztik a Data*putStream oszta lyokat Ü de nem csak adattıpus-ertekeket lehet elmenteni / visszaolvasni, hanem objektumokat is
Ü ObjectInputStream, ObjectOutputStream Ü kiterjesztik a Data*putStream oszta lyokat Ü de nem csak adattıpus-ertekeket lehet elmenteni / visszaolvasni, hanem objektumokat is
void writeObject( Object obj ) throws IOException Object readObject() throws OptionalDataException, ClassNotFoundException, IOException
void writeObject( Object obj ) throws ... Object readObject() throws ...
Szerializa ciü
Serializable
Ü Amikor egy objektumot elmentunk, azokat az objektumokat is el kell menteni, amelyekre hivatkozik... Ü E s ez ıgy megy rekurzıvan... Ü Ha egy objektum a hivatkozottak kí zí tt tí bbszí r is elofordul, akkor is csak egyszer kell elmenteni!
Ü Ezt a bonyolult feladatot a Java megcsina lja nekunk. Ü Csak annyit kell tenni, hogy megvalüsıtjuk a Serializable interfeszt Ö nem specifika l metüdusokat... Ö csak oda kell ırni az oszta lyunk definıciüja ba
Mi is tí rtenik? Ü Metainforma ciü is elmentesre kerul Ö az objektum oszta lya, verziüsza m, stb.
Ü Elmentodnek az objektum adattagjai Ü Elmentodnek a hivatkozott objektumok is rekurzıvan Ü Ha az objektum ma r kora bban el lett mentve, akkor helyette egy "mutatü" lesz elmentve
Java tutorial Copyright á 2000-2001, Kozsik Tama s
25 PDF created with FinePrint pdfFactory trial version http://www.fineprint.com
Pelda
Vector v = new Vector(); v.add("Lennon"); v.add(new Integer(42)); ObjectOutputStream out = new ObjectOutputStream( new FileOutputStream("a.dat") ); out.writeObject(v); out.close(); ObjectInputStream in = new ObjectInputStream( new FileInputStream("a.dat") ); v = (Vector) in.readObject();
Feladat Ü Csina ljunk egy foní kí t ket beosztottal. Mentsuk el a foní kí t. Ü Egy ma sik programmal olvassuk be a foní kí t (a ket beosztottja val egyutt). Ü Az Alkalmazott es a Foní k oszta lyokban ırjunk toString() metüdust, hogy tudjuk tesztelni az elozoket programot... Ü Csak a hecc kedveert... a foní k egyik beosztottja legyen saja t maga.
System.out.println(v);
Finomhangola s Java tutorial Copyright á 2000-2001, Kozsik Tama s
Finomhangola s Ü Lehet szaba lyozni, hogy pontosan mi is mentodjí n el az objektum a ltal ta rolt adatokbül Ü Tí bb szinten nyılik lehetoseg a szaba lyoza sra Ö Ö Ö Ö
transient read/writeObject feluldefinia la sa serialPersistantFields Externalizable
Ü Lehet szaba lyozni, hogy pontosan mi is mentodjí n el az objektum a ltal ta rolt adatokbül Ü Tí bb szinten nyılik lehetoseg a szaba lyoza sra Ö Ö Ö Ö
transient read/writeObject feluldefinia la sa serialPersistantFields Externalizable
transient Ü Egy müdosıtüszü Ö mint pl. public, final, abstract, stb.
Ü Ha egy adattagot nem szeretnenk szerializa ciü sora n elmenteni, akkor ele ırjuk, hogy transient Ü Mire haszna ljuk? Ö Egyszeri adat, pl. eroforra s-leırü (Frame) Ö Bizalmas adat Ö Redunda ns informa ciü
26 PDF created with FinePrint pdfFactory trial version http://www.fineprint.com
A fa jlrendszer fa jljaihoz valü hozza feres Java tutorial Copyright á 2000-2001, Kozsik Tama s
Ü A File oszta lyon keresztul tí rtenhet Ü A File objektumok fa jlneveket reprezenta lnak Ü Nem fa jlokat: egy File objektumon keresztul nem lehet olvasni vagy ırni egy fa jlt. Arra ott vannak Ö a csatorna k Ö a kí zvetlen eleres„ fa jlok
Mit lehet csina lni File objektumokkal? Ü Ü Ü Ü Ü Ü
Lekerdezni, hogy letezik-e olyan nev„ fa jl Lekerdezni, hogy olvashatü/ırhatü-e Egy fa jlt tí rí lni Atnevezni Kí nyvta rat kilista zni stb.
Pelda File t¨rlend˝ = new File("dobj.ki"); if( t¨rlend˝.canWrite() ) t¨rlend˝.delete();
Ü Ezek m„veletek a fa jlrendszeren...
File objektum letrehoza sa File k¨nyvtar = new File("/usr/local/bin"); File ez_is_az = new File("/usr/local","bin"); File fajl = new File(k¨nyvtar,"vim"); String elv = File.separator; File k¨nyvtar = new File(elv+"usr"+elv+"local"+elv+"bin");
M„veletekre pelda public public public public public public public
boolean exists() boolean isFile() boolean renameTo( File cel ) boolean mkdir() boolean isAbsolute() File getParentFile() long lastModified()
27 PDF created with FinePrint pdfFactory trial version http://www.fineprint.com
Feladat Ü Lista zzuk ki a tmp alkí nyvta r í sszes txt kiterjesztes„ fa jlja nak nevet! Ü Ehhez kicsit kí rul kell nezni az API dokumenta ciüban...
Szí vegfeldolgoza s Ü StreamTokenizer Ü Egy csatorna tartalma t tokenekre bontja int nextToken() throws IOException Ö sza mok Ö azonosıtük Ö megjegyzesek
Ü Egy csatorna fí le hozzuk letre, mint egy sz„rot (de ez nem csatorna)
Java tutorial Copyright á 2000-2001, Kozsik Tama s
Szavakra bontunk egy szí veget import java.io.*; class Szavakra { public static void main( String args[] ) throws IOException { StreamTokenizer st = new StreamTokenizer( new InputStreamReader(System.in) ); while( st.nextToken() != StreamTokenizer.TT_EOF ) if( st.ttype == StreamTokenizer.TT_WORD ) System.out.println(st.sval); } } Pr´ba ld ki!
int-tek beolvasa sa szí veges forma tumbül
Javıta s st.ordinaryChar(46); st.slashStarComments(true);
Ü A pont ıra sjel kí zí nseges karakter. A szí vegben a C-stılusŐ megjegyzeseket figyelmen kıvul akarjuk hagyni.
Ü Szí veg forma tum, pl. szí vegfa jl Ü int tıpusŐ ertekeket tartalmaz Ü Szeretnenk egy csatorna oszta lyt, amivel ilyet kí nny„ feldolgozni Ü Sz„rocsatornakent valüsıtjuk meg Ö A PrintStream ”inverze–
Ü Segıt a StreamTokenizer oszta ly A kutya /* ez egy allat */ ugat.
A kutya ugat
28 PDF created with FinePrint pdfFactory trial version http://www.fineprint.com
int-tek beolvasa sa szí veges forma tumbül import java.io.*; class NotExpectedTokenException extends Exception { public int token; public NotExpectedTokenException( int token ) { this.token=token; } }
public int scanInt() throws NotExpectedTokenException, IOException { StreamTokenizer st = new StreamTokenizer(in); st.ordinaryChar('/'); // nincs megjegyzesjel st.ordinaryChar('.'); // ne legyen tizedespont st.nextToken(); if ( (st.ttype==StreamTokenizer.TT_NUMBER) && (st.nval>=Integer.MIN_VALUE) && (st.nval<=Integer.MAX_VALUE) ) return (int)st.nval; // sikerult szamkent ertelmezni else throw new NotExpectedTokenException(st.ttype);
public class TypedReader extends FilterReader { public TypedReader( Reader in ){ super(in); } public int scanInt() throws NotExpectedTokenException, IOException {...} } public static void main( String[] args ) throws IOException {...} }
public static void main( String[] args ) throws IOException { TypedReader in = new TypedReader( new InputStreamReader(System.in) ); int sum = 0; boolean endOfInts = false; while (!endOfInts) { System.out.print("Irjon be egy szamot: "); try { sum += in.scanInt(); System.out.println(); } catch (NotExpectedTokenException e) { endOfInts=true; } } System.out.println("\nAz ¨sszeg: " + sum);
Feladat Ü A ma trix oszta lyhoz ırjunk olyan beolvasü m„veletet, ami egy szí vegfa jlbül olvas be egy ma trixot. A szí vegfa jlban nem feltetlenul soronkent vannak a ma trix elemei, egy sorban lehet tí bb is. Az elemeket feher szükí zí k va lasztja k el. Ha ettol elterobemenetet tapasztalunk, va ltsunk ki kivetelt!
}
Java tutorial Copyright á 2000-2001, Kozsik Tama s
29 PDF created with FinePrint pdfFactory trial version http://www.fineprint.com