Zadání úlohy 8. (zadává se v týdnu od 15. prosince)

V této úloze procvičíme použití souborů, vstupních a výstupních operací, ale i kontejnerů, výjimek atd.

Úkolem bude realizovat jednoduchý správce osobních kontaktů (adresář), v němž bude uživatel mít možnost uchovávat kontaktní údaje o osobách. O každé osobě bude v adreáři zaznamenáno:

  • login (jednoznačný) - řetězec

  • jméno - řetězec

  • příjmení - řetězec

  • e-mail - řetězec

  • telefonní číslo - dlouhé celé číslo

Program by měl určitě obsahovat následují třídy, všechny ve stejném balíku (cvičící určí, jakém):

AddressBook

Třída správce kontaktů.

Bude umět kontakty načíst ze souboru, všechny vypsat a uložit do textového souboru. Soubor, ze kterého se čte a zapisuje, bude určen pro daný správce kontaktů jednou provždy při konstrukci. Zapisuje se do stejného souboru, z něhož se čte. Údaj o jedné osobě bude uložen na právě jednom řádku textového souboru ve formátu: login jméno příjmení e-mail telefon. Jednotlivá pole řádku vstupu jsou oddělena vždy jednou mezerou. Telefon je dlouhé celé číslo, jinak jsou to řetězce. Můžeme předpokládat, že údaje jsou v souboru vždy ve správném formátu, tj. nemusíme chyby vstupu/uživatele detekovat.

Správce kontaktů musí umět zařadit nový kontakt - pozor, login osobu jednoznačně určuje, proto vložením nové osoby s loginem, který už některá stávající osoba má, bude stávající osoba nahrazena.

Dále musí umět vyřadit osobu s daným loginem.

Person

Třída osob.

Každá osoba nese výše uvedené údaje (tj. login, jméno, příjmení, e-mail a telefonní číslo).

Osoba musí umět vypsat nebo vrátit v řetězcové podobě údaje o sobě.

Demo

Demo třída. Udělá po řadě následující operace:

Vytvoří správce kontaktů, tj. jeden objekt typu AddressBook, načtením z textového souboru, jehož jméno je zadáno jako první argument na příkazovém řádku při spuštění aplikace. Nad takto inicializovaným správcem provede následující operace:

Načtené kontakty vypíše.

Načte od uživatele, z příkazového řádku (std. vstupu), údaje o jedné osobě (login, jméno, příjmení, e-mail a telefonní číslo), vytvoří osobu a přidá do správce kontaktů.

Načte od uživatele, z příkazového řádku (std. vstupu), login osoby, kterou chce smazat, a osobu s tímto loginem ze správce kontaktů smaže.

Vypíše všechny kontakty.

Uloží všechny kontakty zpět do souboru na disk.

[Note]Poznámka

Pro inspiraci: takto nějak může (ale nemusí) vypadat metoda na načítání kontaktů na osoby ze souboru:

Obrázek 38. Příklad načítání kontaktů ze souboru

BufferedReader br = new BufferedReader(new FileReader(f));
String line = br.readLine();
while (line != null) {
    Person p = Person.readPerson(line);
    people.put(p.login, p);
    line = br.readLine();
}
br.close();
[Note]Poznámka

Načítání z konzoly (příkazového řádku, standardního vstupu) zrealizujeme takto:

Obrázek 39. Načtení řetězce ze standardního vstupu

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
...
br.readLine(); // vlastní načtení řádku
...
br.readLine(); // a další načtení řádku
[Note]Poznámka

Pro parsing (analýzu, "rozebrání") vstupního řádku při načítání kontaktu můžete použít např. metody řetězce indexOf, kterými najdete pozice mezer ve vstupním řádku a metody substring, kterou vyberete část řádku.

Rovněž je možné - a je to dokonce méně pracné - využít třídy StringTokenizer - viz dokumentace k Java Core API. Objekt této třídy je schopen pohodlně "rozebrat" řetězec na jednotlivé podřetězce původně oddělené mezerami.

[Note]Poznámka

Uložení kontaktů do souboru můžete udělat s pomocí FileWriteru.

Váš cvičící pravděpodobně určí balík, do kterého budete vytvořené třídy ukládat. Stejně tak může upřesnit požadavky na demo třídu.

Pokud cvičící zadání modifikuje, je to OK. Tohle je vzorové zadání. Za úlohu získáte opět max. 5 bodů.