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 adresář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.

[Poznámka] Poznámka

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

Obrázek 9. 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();
[Poznámka] Poznámka

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

Obrázek 10. 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 
[Poznámka] 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.

[Poznámka] Poznámka

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

[Poznámka] Poznámka

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.

[Poznámka] Poznámka

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