Úvod do programování - Cvičení č. 5


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.

Úkoly

  1. Spojování souborů. Prostudujte řešený příklad č. 1. Třída Priklad1 implementuje program, který do souboru, jehož jméno je prvním parametrem programu, okopíruje postupně obsah všech souborů, jejichž jména následují jako zbývající parametry. Není-li jméno výstupního souboru zadáno, zobrazí se nápověda.

    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.

  2. Opis souboru s číslováním řádků. Vytvořte program, který opíše na standardní výstup zadaný soubor s očíslovanými řádky. Není-li zadáno jméno souboru, zpracujte standardní vstup.
    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.
  3. Čtení číselných dat ze souboru. Vytvořte program, který přečte posloupnost celých čísel ze vstupu a vypíše nejmenší a největší hodnotu. Předpokládejte, že na každém řádku vstupu je uvedeno pouze jedno číslo.

    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!