Lekce 4 - Uložení objektů do CSV v Javě
V předchozím kvízu, Kvíz - Základy práce se soubory a výjimky v Javě, jsme si ověřili nabyté zkušenosti z předchozích lekcí.
V dnešním Java tutoriálu vytvoříme plně objektovou formulářovou aplikaci s databází uživatelů, která ukládá instance do textových souborů ve formátu CSV.
Formát CSV
Ve formátu CSV (jako Comma Separated Values) ukládáme hodnoty oddělené
čárkou, případně středníkem. O
metodách split()
a join()
jsme se zmínili v tomto
článku. Dnes je budeme potřebovat.
Třída Uzivatel
Pojďme se shodnout na tom, jak bude naše třída
uživatele vypadat. Následně si ukážeme, jak její instance do CSV
uložíme. Založíme si v NetBeans nový Java projekt a vytvoříme si nový
JFrame
. Dále vytvoříme třídu Uzivatel
. U
uživatele budeme evidovat jeho jméno, věk a
datum, kdy byl registrován. Konstruktor bude instanci
inicializovat na základě těchto 3 vlastností. Přepíšeme
si metodu toString()
tak, aby vrátila jméno
uživatele. Třída tedy bude vypadat takto:
public class Uzivatel { private final String jmeno; private final int vek; private final LocalDate registrovan; public Uzivatel(String jmeno, int vek, LocalDate registrovan) { this.jmeno = jmeno; this.vek = vek; this.registrovan = registrovan; } public String getJmeno() { return jmeno; } public int getVek() { return vek; } public LocalDate getRegistrovan() { return registrovan; } @Override public String toString() { return jmeno; } }
Naimportujeme si balíček java.time.LocalDate
.
Třída Databáze
Třídu uživatele Uzivatel
máme. Vytvoříme
si i třídu pro naši databázi Databaze
. Ta bude
obsahovat kolekci uživatelů, tvořenou instancí třídy
DefaultListModel
. Kolekce bude privátní a
přidávání uživatelů (případně jejich mazání, vyhledávání a
podobně) bude realizováno veřejnými metodami. Databáze
bude obsahovat metody k načtení CSV souboru, a také k
uložení obsahu databáze do souboru. Pro jméno
souboru budeme mít privátní atribut soubor
ve třídě
Databaze
.
Přidejme si tedy k projektu třídu Databaze
:
public class Databaze { private final DefaultListModel<Uzivatel> uzivatele; private final Path soubor; public Databaze(Path soubor) { } public void pridejUzivatele(String jmeno, int vek, LocalDate registrovan) { } public List<Uzivatel> vratVsechny() { } public ListModel<Uzivatel> getModel() { } public void uloz() throws IOException { } public void nacti() throws IOException { } }
NetBeans nám metodu vratVsechny()
podtrhne
červeně (protože nevrací hodnotu), stejně jako getModel()
, ale
toho si zatím nebudeme všímat. Pojďme postupně naimplementovat jednotlivé
metody. Začněme konstruktorem.
Konstruktor
V konstruktoru vytvoříme instanci kolekce ArrayList
a
uložíme si cestu k databázovému souboru:
public Databaze(Path soubor) { uzivatele = new DefaultListModel<>(); this.soubor = soubor; }
Metoda pridejUzivatele()
Pojďme si ukázat, jak budou uživatelé ve formátu CSV vypadat. Každý řádek bude reprezentovat jednoho uživatele. Vlastnosti uživatele budou odděleny středníky.
Například uživatel Pavel Slavík, kterému je 22 let a zaregistroval se 21.3.2000 by ve formátu CSV vypadal takto:
Pavel Slavík;22;21.3.2000
Na první pohled vidíme, že je soubor relativně jednoduše
čitelný, i když nezasvěcený se může jen domnívat, co je číslo
22
a k čemu se váže ono datum. V souboru může být
samozřejmě více uživatelů, tedy více řádků.
Přidáme si metodu pridejUzivatele()
:
public void pridejUzivatele(String jmeno, int vek, LocalDate registrovan) { uzivatele.addElement(new Uzivatel(jmeno, vek, registrovan)); }
Metoda getModel()
Dále si přidáme metodu getModel()
, která vrátí
kolekci uživatelů:
public ListModel<Uzivatel> getModel() { return uzivatele; }
Metoda vratVsechny()
Nakonec si napíšeme metodu vratVsechny()
, která nám vrátí
kolekci uživatelů List<Uzivatel>
:
public List<Uzivatel> vratVsechny() { return Collections.list(uzivatele.elements()); }
Uložení uživatelů do CSV
Nyní se již dostáváme k práci s CSV souborem.
Proiterujeme náš list uživatelů a pro každého uživatele vytvoříme
proměnnou radek
typu String
, ve které budou
jednotlivé vlastnosti uživatele oddělené středníkem.
Obsah proměnné radek
pak zapíšeme do souboru
soubor
:
public void uloz() throws IOException { //nejprve soubor vytvoříme, pokud již existuje tak jej vyprázdníme Files.writeString(soubor, "", StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING); //pak projdeme všechny uživatele //a pro každého vytvoříme řádek s jeho vlastnostmi oddělenými středníkem //řádek poté zapíšeme do souboru for (Uzivatel u : vratVsechny()) { String radek = u.getJmeno() + ";" + u.getVek() + ";" + u.getRegistrovan().toString() + System.lineSeparator(); Files.writeString(soubor, radek, StandardOpenOption.APPEND); } }
Formulář MainJFrame.java
přejděme k souboru formuláře MainJFrame.java
. Zde
vytvoříme privátní atribut databaze
, do kterého v konstruktoru
formuláře uložíme novou instanci naší databáze:
private Databaze databaze; public MainJFrame() { initComponents(); Path path = Path.of(System.getProperty("user.home"), "itnetwork", "uzivatele.csv"); try { Files.createDirectories(path.getParent()); databaze = new Databaze(path); } catch (IOException ex) { Logger.getLogger(MainJFrame.class.getName()).log(Level.SEVERE, null, ex); } }
Na formulář přidejme nové tlačítko, pojmenujme ho
tlacitkoUlozit
a text mu nastavme na "Uložit"
:

Metoda
tlacitkoUlozitActionPerformed()
V Click handleru tlačítka (metodě
tlacitkoUlozitActionPerformed()
, která se vytvoří po dvojkliku
na tlačítko) přidáme do databáze dva uživatele. Bude to
nyní pro vyzkoušení, později bude aplikace vypadat lépe. Dále celou
databázi uložíme do souboru:
private void c(ActionEvent evt) { try { databaze.pridejUzivatele("Pavel Slavík", 22, LocalDate.of(2000, 3, 21)); databaze.pridejUzivatele("Jan Novák", 31, LocalDate.of(2012, 10, 30)); databaze.uloz(); } catch (IOException ex) { JOptionPane.showMessageDialog(null, "Databázi se nepodařilo uložit, zkontrolujte přístupová práva k souboru."); } }
Naimportujeme si balíček
java.awt.event.ActionEvent
.
Testování
Aplikaci spustíme a klikneme na tlačítko. Nyní otevřeme (např. v
NotePadu) soubor uzivatele.csv
a vidíme, že má následující
obsah:
Pavel Slavík;22;21.3.2000 Jan Novák;31;30.10.2012
Vše tedy funguje, jak má .
V příští lekci , Uložení objektů do CSV v Javě - Dokončení, dokončíme naši objektovou formulářovou aplikaci s databází uživatelů s použitím textových souborů ve formátu CSV.
Měl jsi s čímkoli problém? Stáhni si vzorovou aplikaci níže a porovnej ji se svým projektem, chybu tak snadno najdeš.
Stáhnout
Stažením následujícího souboru souhlasíš s licenčními podmínkami
Staženo 81x (6.5 kB)
Aplikace je včetně zdrojových kódů v jazyce Java