4. diel - Uloženie objektov do CSV v Jave
V minulej lekcii, Práca s textovými súbormi v Jave , sme si ukázali zápis do textových súborov aj ich čítanie. Aplikácia bola jednoduchá a skôr učebnicová. Urobme si teraz naozajstnú databázu užívateľov pomocou textových súborov. Ukladať budeme samozrejme objekty, čiže si program ľahko prerobíte na databázu upomienok v diári, databáze najlepších výsledkov v hre, databázu zvierat v chovnej stanici alebo na čokoľvek, čo budete potrebovať evidovať.
Formát CSV
Nebudeme vymýšľať žiadny zložitý spôsob ukladania dát do textových súborov, pretože už jeden osvedčený a štandardné existuje. Volá sa CSV (ako Comma Separated Values), teda hodnoty oddelené čiarkou, prípadne bodkočiarkou. O CSV sme sa zmienili v článku o metódach split () a join () na reťazci, dnes je teda budeme potrebovať.
Poďme sa zhodnúť na tom, ako bude trieda užívateľa vyzerať. Následne
si ukážeme, ako jej inštancie do CSV uložíme. Založte si v NetBeans nový
Java Swing projekt a vytvorte si nový
JFrame
. Samozrejme môžete použiť aj JavaFX, ak chcete. Ďalej vytvoríme triedu
Uzivatel
. U užívateľa budeme evidovať jeho meno, vek a dátum,
kedy bol registrovaný. Konštruktor bude inštanciu inicializovať na základe
týchto 3 vlastností. Prepíšeme si metódu toString()
tak, aby
vrátila meno používateľa. Trieda teda bude vyzerať takto:
public class Uzivatel { private String jmeno; private int vek; private 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; } }
Nezabudnite si naimportovať LocalDate
.
Poďme si ukázať, ako budú používatelia vo formáte CSV vyzerať. Každý riadok bude reprezentovať jedného používateľa. Vlastnosti užívateľa budú oddelené bodkočiarkami. Užívateľ Pavel Slavík, ktorému je 22 rokov a zaregistroval sa 21.3.2000 by vyzeral takto:
Pavel Slavík;22;21.3.2000
Na prvý pohľad vidíme, že je súbor relatívne jednoducho čitateľný, aj keď Nezainteresovaný sa môže len domnievať, čo je číslo 22 a na čo sa viaže ono dátum.
V súbore môže byť samozrejme viac užívateľov, teda viac riadkov.
Triedu užívateľa máme, pretože však ctíme objektový návrh,
vytvoríme si aj triedu pre našu databázu. Tá bude obsahovať kolekciu
užívateľov, tvorenou inštancií triedy DefaultListModel
. Túto
kolekciu sme zvolili preto, že ju neskôr môžeme napojiť na Swing
ListView
a zobrazovať tak naše užívateľa vo formulári.
Kolekcia bude privátne a pridávanie užívateľov (prípadne ich mazanie,
vyhľadávanie a podobne) bude realizované verejnými metódami. Databáza bude
konečne obsahovať metódy na načítanie CSV súboru a tiež na uloženie
obsahu databázy do súboru. Meno súboru bude ďalší privátnej atribút
databázy. Pridajme si teda k projektu ďalšiu triedu Databaze
a
nápis jej kostru:
class Databaze { DefaultListModel<Uzivatel> uzivatele; private String soubor; public Databaze(String 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 metódu vratVsechny()
podčiarkne červeno
(pretože nevracia hodnotu), rovnako ako getModel()
, ale toho si
zatiaľ nebudeme všímať. Poďme postupne naimplementovať jednotlivé
metódy. Začnime konstruktoru.
V konstruktoru vytvoríme inštanciu ArrayList
ua uložíme si
cestu na databázový súboru:
public Databaze(String soubor) { uzivatele = new DefaultListModel<>(); this.soubor = soubor; }
To bolo veľmi jednoduché a aj na ďalšie metóde nie je čo vymýšľať:
public void pridejUzivatele(String jmeno, int vek, LocalDate registrovan) { Uzivatel u = new Uzivatel(jmeno, vek, registrovan); uzivatele.add(u); }
Metóda getModel()
iba vráti kolekciu užívateľov:
public ListModel<Uzivatel> getModel() { return uzivatele; }
Metóda vratVsechny()
nám vráti všetkých užívateľov.
Podobne môžeme v budúcnosti urobiť metódy pre vyhľadávanie len
niektorých užívateľov. Užívateľa vrátime vo forme poľa:
public List<Uzivatel> vratVsechny() { return Collections.list(uzivatele.elements()); }
Uloženie užívateľov do CSV
Teraz sa konečne dostávame k práci s CSV súborom. Začneme blokom
try
- catch
with resources s inštanciou
BufferedWriter
u. Vnútri proiterujeme náš list užívateľov a
pre každého užívateľa vytvoríme pole String
ov z jeho
vlastností. Nestringové vlastnosti musíme na String
explicitne
previesť. Pole potom spojíme na dlhý String
, v ktorom budú
položky oddelené bodkočiarkami. Spojenie za nás vykoná metóda
join()
. Tá sa na rozdiel od metódy split()
volá
priamo na triede String
a ako parameter (spojovací text) berie
tiež String
, nie char
. Pusťme sa do toho:
public void uloz() throws IOException { // Otevření souboru pro zápis try (BufferedWriter bw = new BufferedWriter(new FileWriter(soubor))) { // projetí uživatelů for (Uzivatel u : vratVsechny()) { // Vytvoření pole hodnot String[] hodnoty = {u.getJmeno(), String.valueOf(u.getVek()), u.getRegistrovan().toString()}; // Vytvoření jednoho řádku String radek = String.join(";", hodnoty); // Zápis řádku bw.append(radek); // Zápis "enteru", abychom se dostali na nový řádek bw.append("\n"); } // Vyprázdnění bufferu bw.flush(); } }
Poďme si všetko vyskúšať, prejdime k súboru formulára
(MainJFrame.java
). Tu vytvoríme privátne atribút
databaze
, do ktorého v konstruktoru formulára uložíme novú
inštanciu našej databázy:
private Databaze databaze; public MainJFrame() { initComponents(); databaze = new Databaze("uzivatele.csv"); }
Na formulár pridajme nové tlačidlo, pomenujte ho
tlacitkoUlozit
a text mu nastavme na "Uložit"
.
V jeho Click Handler (metóde, čo sa vytvoria po dvojkliku na tlačidlo) pridáme do databázy 2 používateľa. Bude to teraz pre vyskúšanie, neskôr bude aplikácia vyzerať lepšie. Ďalej celú databázu uložíme do súboru:
private void jButton1ActionPerformed(java.awt.event.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."); } }
Aplikáciu spustíme a klikneme na tlačidlo. Teraz otvoríme (napr. V notepad) súbor uzivatele.csv (v zložke s projektom) a vidíme, že má nasledujúci obsah:
Pavel Slavík;22;21.3.2000 Jan Novák;31;30.10.2012
Všetko teda funguje, ako má Načítanie užívateľov a dokončenie aplikácie si necháme na budúci lekciu, Uloženie objektov do CSV v Jave časť 2 .
Stiahnuť
Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkamiStiahnuté 64x (6.5 kB)