Cvičenie 8 – Čítanie zo súboru

Ciele cvičení:

  • Čítanie a zapisovanie z/do textových súborov.

Záznam kliknutí

Vytvorte triedu ClickPane, ktorá bude rozširovať triedu WinPane. Klikacia plocha nech funguje tak, že pri kliknutí do plochy sa mieste kliknutia nakreslí bodka náhodného polomeru medzi 2 až 5. Do triedy ClickPane pridajte metódu saveClicksToFile, ktorá ako parameter dostane názov súboru (alebo referenciu na objekt triedy File s názvom súboru). Táto metóda nech uloží do zadaného súboru informácie o všetkých nakreslených bodkách od vytvorenia plochy. Informácia o jednej bodke nech je v jednom riadku súboru a skladá sa z 3 čísel: x-ová súradnica stredu bodky, y-ová súradnica stredu bodky a polomer bodky.

Môžete predpokladať, že nikdy sa nespraví viac ako 1000 bodiek od vytvorenia kresliacej plochy (t.j. nemeňte veľkosť poľa po každom kliknutí).


1
2
3
public void saveClicksToFile(String filename)
// alebo
public void saveClicksToFile(File file)

Príklad súboru:


1
2
3
100 121 3.5
10 252 2.5
241 139 4.0

Do triedy ClickPane pridajte „protimetódu“, ktorá na základe obsahu textového súboru s vyššie opísaným formátom nakreslí do kresliacej plochy v ňom uložené bodky.

Upozornenie: Ak chcete použiť ObjectInspector na zavolanie metód objektov triedy ClickPane pracujúcich so súbormi, musíte použiť verziu s parametrami typu String.

Analýza súborov

Vytvorte triedu TextTurtle, ktorá rozširuje triedu Turtle a ktorá bude poskytovať základné spracovanie textových súborov.

  • Priemer čísel: Pridajte do triedy TextTurtle metódu, ktorá ako parameter dostane názov súboru (prípadne referenciu na objekt triedy File). V tomto súbore sú len celé čísla oddelené medzerami (v jednom riadku môže byť aj viacero čísel). Vytvorená metóda nech vráti priemer čísel v súbore.

1
2
3
public double average(String filename)
// alebo
public double average(File file)
  • Počet riadkov: Pridajte do triedy TextTurtle metódu, ktorá ako parameter dostane názov súboru (prípadne referenciu na objekt triedy File). Vytvorená metóda nech vráti počet riadkov v súbore.

1
2
3
public int countLines(String filename)
// alebo
public int countLines(File file)

Riadená korytnačka

Vytvorte triedu ControlledTurtle, ktorá bude rozširovať triedu Turtle. Do triedy ControlledTurtle pridajte metódu executeFile. Táto metóda dostane ako parameter názov (resp. cestu k) súboru s príkazmi pre korytnačku. Na cvičení stačí, ak naprogramujete vykonanie aspoň jedného príkazu bez parametrov a aspoň jedného príkazu s parametrami.


1
public void executeFile(String filename)

Pre obsah súboru s príkazmi platia tieto pravidlá:

  • v každom riadku je jeden príkaz
  • každý príkaz začína svojim názvom a je nasledovaný parametrami (reálne čísla)
  • v súbore môžu byť tieto príkazy:
    • center
    • penDown
    • penUp
    • step (1 parameter)
    • turn (1 parameter)
    • dot (1 parameter)
    • setPosition (2 parametre)
    • moveTo (2 parametre)

Príklad vstupného súboru:


1
2
3
4
5
6
7
8
9
10
setPosition 100 170
step 100
turn 120
dot 5
step 100
turn 120
dot 5
step 100
turn 120
dot 5

Rada: Vytvorte si pomocnú metódu, ktorá dostane ako parameter jeden riadok súboru (jeden príkaz) a vykoná príkaz v tomto riadku. Na spracovanie riadka použite Scanner znakového reťazca.


1
public void executeCommand(String line)

Pre fajnšmekrov: vymyslite taký formát vstupného súboru, aby umožňoval zopakovať nejakú postupnosť príkazov zadaný počet krát (niečo ako for-cyklus s pevným počtom opakovaní).

Ako súčasne čítať a zapisovať

Niekedy je potrebné súčasne čítať jeden súbor a zapisovať do iného súboru. Na túto činnosť môžeme použiť takúto schému:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
Scanner citac = null;
PrintWriter zapisovac = null;
try {
    citac = new Scanner(...);
    zapisovac = new PrintWriter(...);
        // pracujeme s citacom a zapisovacom
} catch (FileNotFoundException e) {
    e.printStackTrace();
} finally {
    if (citac != null) {
        try {
            citac.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    if (zapisovac != null) {
        try {
            zapisovac.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Visual scanner dependency


1
2
3
4
5
<dependency>
    <groupId>sk.upjs</groupId>
    <artifactId>visual-scanner</artifactId>
    <version>1.0.0</version>
</dependency>