Autor: | Miroslav Beneš |
---|---|
Organizace: | Katedra informatiky FEI VŠB-TU Ostrava |
Popis: | Cílem tohoto cvičení je seznámení s metodami programování operací vstupu a výstupu a se způsobem ošetření výjimek. |
Pro čtení i zápis je použito filtru, který zajistí efektivnější zpracování dat pomocí vyrovnávací paměti. I když při kopírování čteme a zapisujeme data po jednotlivých znacích, probíhá komunikace se soubory ve větších blocích daných velikostí vyrovnávací paměti. Ta může být zadána jako druhý parametr konstruktoru filtrů BufferedReader nebo BufferedWriter, případně je použita vhodná implicitní hodnota.
Je-li během zpracování odchycena výjimka, předá se objekt reprezentující výjimku jako parametr konstrukce catch. Tento objekt můžeme použít pro získání textové reprezentace výjimky metodou toString(), případně můžeme voláním
e.printStackTrace();zajistit vypsání informací o rozpracovaných voláních funkcí v okamžiku vzniku výjimky. Je-li při překladu programu zajištěno generování informací pro ladění, obsahuje výpis také jméno zdrojového souboru a číslo řádku, na němž byly funkce volány. Vyzkoušejte si to odkomentováním řádku uvnitř konstrukce catch a spuštěním programu s neexistujícím jménem vstupního souboru.
Standardní vstup reprezentovaný proměnnou System.in je objektem typu InputStream. Pokud jej chceme použít v kontextu, kde probíhá zpracování textových dat, je třeba tento slabikový proud transformovat na proud znaků. To zajistíme obalením proměnné System.in filtrem typu InputStreamReader:BufferedReader inp; if( args.length == 0 ) inp = new BufferedReader(new InputStreamReader(System.in)); else inp = new BufferedReader(new FileReader(args[0]));V obou případech navíc použijeme filtr BufferedReader, jenž zajistí efektivnější zpracování vstupu pomocí vyrovnávací paměti. Navíc tato třída nabízí přímo metodu readLine(), kterou můžeme najednou načíst celý řádek textu.
Pro čtení opět použijte BufferedReader a jeho metodu readLine(). Načtený řetězec převedete na celočíselnou hodnotu pomocí metody Integer.parseInt(). Tato statická metoda generuje výjimku NumberFormatException v případě, že zadaný řetězec není platným celým číslem - nezapomeňte tuto výjimku ošetřit. Jedná se o výjimku, která je odvozena od RuntimeException, takže pokud ji neošetříme, nebude se při překladu hlásit chyba!