pojem stream pojem stream súborové streamy výnimky bufferované streamy stream a klávesnica
ak chceme získavať údaje z, alebo posielať údaje do miesta iného ako náš program, potrebujeme vytvoriť komunikačný kanál pre prenos informácií ak chceme získavať údaje z, alebo posielať údaje do miesta iného ako náš program, potrebujeme vytvoriť komunikačný kanál pre prenos informácií kanál označuje sa ako stream - možno si ho predstaviť ako trubku (stream), ktorej koniec máme k dispozícii
- z trubky nám môžu údaje vypadávať (po jednom, sekvenčne za sebou)
- alebo ich do nej môžeme vkladať (opäť po jednom)
prostredníctvom streamov vieme pristupovať k: - pamäti
- súboru
- používateľskému vstupu/výstupu
- IP sieti a pod.
knižnica java.io obsahuje komplexnú hierarchiu (viď tutorial) knižnica java.io obsahuje komplexnú hierarchiu (viď tutorial) základné rozdelenie: - binárne (abstraktné triedy InputStream, OutputStream)
- pracujú so surovými bajtami (číselné hodnoty reprezentujúce napr. znaky – ASCII, Unicode)
- textové (abstraktné triedy Reader, Writer)
- prekladajú bajty (resp. skupiny bajtov) podľa nastavenia prostredia: 1 znak = 1 alebo 2 bajty
životný cyklus: životný cyklus: - vytvorenie
- otvorenie – stream sa často otvára už pri vytvorení, pokiaľ však otvorený nebol, je nutné túto operáciu vykonať (alokácia potrebných systémových prostriedkov)
- vlastná práca – vykonávajú sa potrebné operácie (volanie metód streamu)
- uzatvorenie – nutné z dôvodov:
- nezapísania údajov v cache
- zablokované pre ostatné objekty/procesy/používateľov
všetky chybové stavy sú riešené výnimkami všetky chybové stavy sú riešené výnimkami základná výnimka IOException výnimka je povinná - bez jej použitia program neskompilujete
- je spoločná pre všetky streamy
- každý príkaz streamu v nej musí byť uzavretý
FileInputStream, FileOutputStream – príklad FileInputStream, FileOutputStream – príklad Vygenerujte pole náhodných čísel a zapíšte ho do súboru.
už spomenutá výnimka už spomenutá výnimka - udalosť, ktorá vzniká počas behu programu a prerušuje normálny tok inštrukcií
- obvykle ide o chybu
výnimky sa odchytávajú prostredníctvom bloku try – catch – finally - try = skús
- ohraničuje blok príkazov, v ktorom môže dôjsť k chybe
- catch = odchyť (chybu)
- ukončuje blok príkazov a zároveň popisuje, čo sa má stať, ak ku chybe došlo (napr. vypísať info)
- finally = ukončenie
- kód, ktorý sa má vykonať aj v prípade výnimky, aj ak k nej nedôjde (napr. uvoľnenie pamäte)
int i; int i; String s; ... try { i=Integer.parseInt(s); } catch(NumberFormatException e) { System.out.println("Retazec nie je cislo!"); }
... ... try { ... subor.close(); } catch (IOException e) { System.out.println("Chyba:"+e.getMessage()); } IOException – vstupno/výstupná výnimka - detailnú informáciu o nej možno získať z metódy getMessage
public static void main(String[] args) { public static void main(String[] args) { int[] pole= new int[10]; for(int i=0;i
pole[i] = (int) (Math.random()*100); System.out.println(pole[i]); } try { OutputStream ff = new FileOutputStream("udaje.dat"); for(int i=0;i
ff.write(pole[i]); } ff.close(); } catch (IOException e) { // ak pride k chybem vypise sa ku akej System.out.println(e.getMessage()); } }
65 65 38 44 60 18 47 74 27 14 36
// nacitavame aj znak konca suboru, pole musi byt vacsie int[] pole= new int[20]; int i=0; // ukazovatel na nacitavany prvok v poli try { // InputStream sluzi na citanie InputStream ff = new FileInputStream("udaje.dat"); do { pole[i] = ff.read(); // do pole[i] nacita bajt z ff // ak sa precita -1 je to info o konci suboru } while (pole[i]>-1); ff.close(); // zavretie suboru } catch (IOException e) { // lapame vynimku System.out.println(e.getMessage()); // vypis detailu }
ak si chcete overiť fungovanie odchytávania chýb, vymažte súbor a spustite program, ktorý sa ho pokúsi otvoriť ak si chcete overiť fungovanie odchytávania chýb, vymažte súbor a spustite program, ktorý sa ho pokúsi otvoriť
prepíšte obsah súboru na text a pokúste sa ho v Jave prečítať a vypísať v textovej podobe. prepíšte obsah súboru na text a pokúste sa ho v Jave prečítať a vypísať v textovej podobe. čítanie a výpis predošlým spôsobom zrejme veľa úžitku neprinesie prečítané údaje (bajt) pretypujeme na char (pretypovanie poznáme už z minulej prednášky): - je však potrebné ošetriť prečítanie konca súboru
- pretypovanie hodnoty -1 na char vráti nedefinovanú hodnotu
char[] pole = new char[20]; // pole je znakove char[] pole = new char[20]; // pole je znakove int cislo,i=0; try { InputStream ff = new FileInputStream("udaje.dat"); do { cislo = ff.read(); // precita udaj zo suboru ako bajt if (cislo>-1) { // ak nie je koniec i++; // zvysi pocet precitanych prvkov } } while (cislo>-1); // a zisti ci bol koniec suboru ff.close(); // zavrie subor } catch (IOException e) { System.out.println(e.getMessage()); }
čítanie súboru po bytoch však nie je naším cieľom čítanie súboru po bytoch však nie je naším cieľom - v prípade Unicode by sme už museli znak vytvárať z dvojice bajtov a počas práce by sme určite narazili na množstvo ďalších obmedzení
práca s bajtami je navyše veľmi neefektívna: - každé prečítanie a každý zápis sa vykonáva priamo na zdroji (na fyzickom zariadení) => zaťažovanie súborového systému, zdržiavanie, opotrebúvanie hardvéru atď.
pre prácu s textom, ktorá tvorí veľkú väčšinu práce je žiaduce používať „bezpečnejšie“ typy:
streamy, ktoré okrem základných operácií obsahujú buffer (vyrovnávaciu pamäť) a sadu ďalších operácií, prostredníctvom ktorých optimalizujú prístup k údajom streamy, ktoré okrem základných operácií obsahujú buffer (vyrovnávaciu pamäť) a sadu ďalších operácií, prostredníctvom ktorých optimalizujú prístup k údajom bufferovaný stream vytvárame obvykle tak, že mu ako vstupný parameter konštruktora zadáme podriadený stream, napr.: BufferedReader br = new BufferedReader(new FileReader("subor.txt")); umožňuje čítanie riadkov: s = br.readLine() najvrchnejší „stream“ pri svojom zavretí uzavrie aj všetky „nižšie postavené“
Napíšte program schopný prečítať zadaný textový súbor po riadkoch a vypísať ich. Napíšte program schopný prečítať zadaný textový súbor po riadkoch a vypísať ich.
String riadok; String riadok; try { // vytvorim filereader na čítanie z textového suboru FileReader ff = new FileReader("udaje.txt"); // „zabalim ho“ do bufferovanej triedy BufferedReader subor = new BufferedReader (ff); do { riadok = subor.readLine(); // precitam riadok // ak nebol koniec suboru (hodnota null) vypisem if (riadok != null ) System.out.println(riadok); } while (riadok != null); // kym nie je koniec sub. } catch (IOException e) { System.out.println(e.getMessage()); }
Napíšte program, ktorý vygeneruje zadaný počet náhodných celých čísel a uloží ich do textového súboru. Napíšte program, ktorý vygeneruje zadaný počet náhodných celých čísel a uloží ich do textového súboru.
pri riešení použite InputDialog, v našom riešení nastavíme hodnotu v kóde
Zabezpečte, aby každé číslo bolo uložené v osobitnom riadku.
int cislo, pocet=10; int cislo, pocet=10; String txt; try {// pre zapis zase File- a Buffered-Writer FileWriter ff = new FileWriter("cisla.txt"); BufferedWriter subor = new BufferedWriter (ff); for(int i=0;i
cislo = (int) (-500+Math.random()*1001); // nah. cislo txt = Integer.toString(cislo); // prevod na string subor.write(txt);// zapis textu do suboru subor.newLine(); // odriadkovanie, resp. doplnenie „/n“ } subor.close(); // zatvorenie suboru } catch (IOException e) { System.out.println(e.getMessage()); }
údaje prichádzajú do programu cez buffer na začiatku bolo preto pre nás jednoduchšie volať InputDialog, ktorý vracal string niekedy je však nevyhnutné použiť aj konzolový vstup
cez InputStreamReader „tečú“ znaky z System.in a následne sa preklápajú do BufferredReadera, odkiaľ už vieme prečítať celý riadok cez InputStreamReader „tečú“ znaky z System.in a následne sa preklápajú do BufferredReadera, odkiaľ už vieme prečítať celý riadok try { InputStreamReader kb = new InputStreamReader (System.in); // „obalim“ ho buferom BufferedReader bufer = new BufferedReader (kb); // ten disponuje metodou na precitanie riadku // ukoncenie riadku na vstupe oznamim Enterom String vstup = bufer.readLine(); // koniec prace s buferom bufer.close(); }catch (IOException e) { System.out.println(e.getMessage()); }
analógia, čítam vstup kým nestlačím Enter analógia, čítam vstup kým nestlačím Enter následne sa začne spracúvať buffer dôležitou je podmienka ukončenia - napr. Enter? (ukončovací znak \n)
- iný znak (0, x a pod.)
String vstup=""; String vstup=""; char znak; int i=0; try { InputStreamReader kb = new InputStreamReader(System.in); BufferedReader bufer = new BufferedReader (kb); do { i = bufer.read(); // udaj vstupi ako cislo bajt znak = (char) i; // pretypuje sa na znak // prida sa k vstupnemu retazcu vstup = vstup + String.valueOf(znak); System.out.println("data:"+vstup); // kontrolny vypis } while (znak != '\n'); // ukoncovacia podmienka-ENTER bufer.close(); // uzatvorenie buffera } catch (IOException e) { System.out.println(e.getMessage());}
Dostları ilə paylaş: |