Java esminės klasės, 1 dalis Išimtys, Įvestis/išvestis
Klaidų apdorojimas C kalboje If (kazkokia_salyga) { klaidos_apdorojimas(); return... } Tokio kodo apimtis galėdavo sekti iki 70-80proc.
Klaidų/išimčių apdorojimas Javoje Java kalboje yra specializuota klasė Throwable, kuri yra visų klaidų/išimčių apdorojimo motina. Tiesiogiai nuo jos paveldi Exception ir Error. Kaip taisyklė programuotojas turi pagalvoti apie Exception klasės (ir nuo jos paveldėtų) išimčių apdorojimą. Pats apdorojimas susietas su specifine Java kalbos sintakse, kurioje yra raktiniai žodžiai try, catch, finally, throw, throws.
I/O Javoje Viena iš standartinių situacijų, kada reikalingas išimčių apdorojimas, yra bylos atidarymas skaitymui/rašymui. Java kalboje I/O operacijos valdomos atitinkamų klasių objektų pagalba. Visos I/O klasės sudaro tam tikrą hierarchiją. Pats fundamentaliausi Įvesties/išvesties objektai yra baitų srautų skaitytojai/rašytojai
Kaip skaitomos/rašomos baitų sekos? java.lang.object java.io.inputstream java.io.outputstream
java.io.inputstream (OutputStream) Tai abstrakti klasė. Dokumentacijoje matysime, kad joje apibrėžtas abstraktus metodas read(), kuris nuskaito sekantį baitą iš srauto. Visi kiti metodai yra konkretūs. Daugiau galite pažiūrėti čia : http://java.sun.com/javase/7/docs/api/java/io/inputstream.html Analogiška situacija yra ir su išvesties srautais.
FileInputStream java.lang.object java.io.inputstream java.io.fileinputstream
FileInputStream metodai, konstruktoriai. FileInputStream( String vardas ); Yra ir kitų konstruktorių... int read() - skaito vieną baitą; int read(byte[ ] masyvas) nuskaitys masyvas.length baitų, grąžina -1, jeigu neišėjo tiek nuskaityti;... daugiau skaitykite Java API dokumentacijoje
Išimtys skaitant iš FileInputStream (citata iš oficialios dokumentacijos) Throws : FileNotFoundException - if the file does not exist, is a directory rather than a regular file, or for some other reason cannot be opened for reading. SecurityException - if a security manager exists and its checkread method denies read access to the file.
Kaip išimtis apdoroti Galime apdoroti toje pačioje vietoje: tada naudojame try { } [ catch(){} ]... [ catch() ] [ finally ]; Arba galime ties atitinkamo metodo parašyti throws... Derinti abudu metodus
try... catch... (pavyzdys)
try... catch... finally / throws
IndexOutOfBoundsException Tarkime, kad turime tokį kodą: class BlogasIndeksas{ } } public static void main(string[] args) { int[] a = new int[10]; a[ 100 ] = 100;
Kaip pagauti šią išimtį? class BlogasIndeksas2{ public static void main(string[] args) { int[] a = new int[10]; try{ a[ 100 ] = 100; } //catch(exception e){ // System.out.println("Klaida: " + e); //} catch(indexoutofboundsexception e){ System.out.println("Klaida: " + e); }... Kas bus, jeigu nuimsime komentarus?
Dvejetainių (angl. binary) failų apdorojimas Anksčiau nagrinėtos klasės FileInputStream ir FileOutputStream yra žemo lygio dvejetainių failų apdorojimo klasės. Praktinėje veikloje dažniausiai naudojami šių klasių vaikai. Tam, kad galėtume skaityti/rašyti kitus primityvius Java tipus (short, int, long etc.) yra apibrėžtas specialus Java interfeisas, kuris vadinasi DataInput/DataOutput
... tęsinys DataInput (rinktiniai metodai): boolean readboolean(); byte readbyte() ; charreadchar(); void readfully(byte[] b); void readfully(byte[] b, int off, int len) ; String readline(); Int readunsignedbyte(); // naudingi apdorojant informaciją Int readunsignedshort();// naudingi apdorojant informaciją String readutf(); Int skipbytes(int n)
FilterInputSream/FilterOutputStream Hierarchija: java.lang.object java.io.inputstream java.io.filterinputstream Turi papildomą atributą: lauką, kuris nurodo duomenų šaltinį. Tiesiog realizuoja ( implementuoja ) InputStream metodus, nes InputStream NETURI jokių prieinamų atributų.
DataInputStream/DataOutputStream public class DataInputStream extends FilterInputStream implements DataInput Paprastai naudojama ši klasė duomenims, kurie įrašyti su DataOutpuStream
Reader/Writer -> pagrindiniai abstraktieji simbolių skaitytojai ir rašytojai Tai tiesioginiai java.lang.object vaikai; Šios klasės naudojamos simbolių (char) skaitymui; Reader turi metodą read(), kuris skaito vieną simbolį, t.y., gauname reikšmę nuo 0 iki 65535 arba -1 (jeigu nėra ką skaityti); Metodai close() ir masyvo skaitymo read(char[] simboliai) yra abstraktūs; Writer elgiasi panašiai.
FileReader/FileWriter -> Reader/Writer vaikai Šios klasės naudojamos simbolių (char) skaitymui; FileReader realizuoja minėtus abstrakčius metodus; FileWriter elgiasi panašiai.
Ką išveda visos trys programos? Pradinis tekstas: AĄBCDEFGHI Viena eilutė UTF-8 koduotė (Ą koduojama kaip C4 84 ) Baitai,Baitai2 : 65 196 132 66 67 68 69 70 71 72 73 Simboliai: 65 260 66 67 68 69 70 71 72 73
Buferizuotas skaitymas/rašymas Atliekant skaitymo/rašymo operacijos patogu turėti buferį - atminties sritį kurioje įrašyti skaitymui / rašymui paruošti duomenys; Motyvacija: eidami į parduotuvę dauguma žmonių perką keletą produktų (pienas, duona, bulvės,...) tam, kad n kartų nereikėtų lakstyti tenai ir atgal Buferizuotam I/O yra klasės BufferedReader ir PrintWriter ( klasių Reader ir Writer vaikai)
Savarankiškai Klasė RandomAccessFile Klasė File Tekstinių failų I/O Pasiruošti testui: klasių paveldimumas, interfeisai, išimtys, I/O
Namų darbai Namų darbai (individualiai iki 2010 04...) - pagal nuorodą puslapyje