4. diel - Uloženie objektov do CSV v Jave
V predchádzajúcom kvíze, Kvíz - Základy práce so súbormi a výnimkami v Jave, sme si overili nadobudnuté skúsenosti z predchádzajúcich lekcií.
V dnešnom tutoriáli Java vytvoríme plne objektovú formulárovú aplikáciu s databázou užívateľov, ktorá ukladá inštancie do textových súborov vo formáte CSV.
Formát CSV
Vo formáte CSV (ako Comma Separated Values) ukladáme hodnoty oddelené
čiarkou, prípadne bodkočiarkou. O metódach
split() a join() sme hovorili v tomto
článku. Dnes ich budeme potrebovať.
Trieda User
Poďme sa zhodnúť na tom, ako bude naša trieda
používateľa vyzerať. Následne si ukážeme, ako jej inštancie do
CSV uložíme. V IntelliJ si vytvoríme nový projekt Java a vytvoríme si nový
JFrame. Ďalej vytvoríme triedu User. 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 User { private final String name; private final int age; private final LocalDate registered; public User(String name, int age, LocalDate registered) { this.name = name; this.age = age; this.registered = registered; } public String getName() { return name; } public int getAge() { return age; } public LocalDate getRegistered() { return registered; } @Override public String toString() { return name; } }
Naimportujeme si balíček java.time.LocalDate.
Trieda Database
Triedu užívateľa User máme. Vytvoríme si
aj triedu pre našu databázu Database. Tá bude
obsahovať kolekciu užívateľov, tvorenú inštanciou triedy
DefaultListModel. Kolekcia bude privátna a
pridávanie užívateľov (prípadne ich mazanie, vyhľadávanie a podobne) bude
realizované verejnými metódami. Databáza bude obsahovať
metódy na načítanie CSV súboru, a tiež na
uloženie obsahu databázy do súboru. Pre meno
súboru budeme mať privátny atribút file v triede
Database.
Pridajme si teda k projektu triedu Database:
public class Database { private final DefaultListModel<User> users; private final Path file; public Database(Path file) { } public void addUser(String name, int age, LocalDate registered) { } public List<User> getAll() { } public ListModel<User> getModel() { } public void save() throws IOException { } public void load() throws IOException { } }
IntelliJ nám metódu getAll() podčiarkne na
červeno (pretože nevracia hodnotu), rovnako ako getModel(), ale
to si zatiaľ nebudeme všímať. Poďme postupne naimplementovať jednotlivé
metódy. Začnime konštruktorom.
Konštruktor
V konštruktore vytvoríme inštanciu kolekcie ArrayList a
uložíme si cestu k databázovému súboru:
public Database(Path file) { users = new DefaultListModel<>(); this.file = file; }
Metóda addUser()
Poďme si ukázať, ako budú používatelia vo formáte CSV vyzerať. Každý riadok bude predstavovať jedného používateľa. Vlastnosti užívateľa budú oddelené bodkočiarkami.
Napríklad užívateľ John Smith, ktorý má 22 rokov a zaregistroval sa 21.3.2000 by vo formáte CSV vyzeral takto:
John Smith;22;3-21-2000
Na prvý pohľad vidíme, že je súbor relatívne jednoducho
čitateľný, aj keď ten, kto sa s tým bežne nestretáva, sa môže len
domnievať, čo je číslo 22 a na čo sa viaže daný dátum. V
súbore môže byť samozrejme viac používateľov, teda viac riadkov.
Pridáme si metódu addUser():
public void addUser(String name, int age, LocalDate registered) { users.addElement(new User(name, age, registered)); }
Metóda getModel()
Ďalej si pridáme metódu getModel(), ktorá vráti
kolekciu používateľov:
public ListModel<User> getModel() { return users; }
Metóda getAll()
Nakoniec si napíšeme metódu getAll(), ktorá nám vráti
kolekciu užívateľov List<User>:
public List<User> getAll() { return Collections.list(users.elements()); }
Uloženie užívateľov do CSV
Teraz sa už dostávame k práci s CSV súborom.
Preiterujeme náš zoznam užívateľov a pre každého užívateľa vytvoríme
premennú line typu String, v ktorej budú jednotlivé
vlastnosti užívateľa oddelené bodkočiarkou. Obsah
premennej line potom zapíšeme do súboru file:
public void save() throws IOException { // first we create the file, if it already exists we empty it Files.writeString(file, "", StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING); // then we go through all the users // and create a line for each with its properties separated by semicolons // line is then written to the file for (User u : getAll()) { String line = u.getName() + ";" + u.getAge() + ";" + u.getRegistered().toString() + System.lineSeparator(); Files.writeString(file, line, StandardOpenOption.APPEND); } }
Formulár MainJFrame.java
Prejdime k súboru formulára MainJFrame.java. Tu vytvoríme
privátny atribút database, do ktorého v konštruktore formulára
uložíme novú inštanciu našej databázy:
private Database database; public MainJFrame() { Path path = Path.of(System.getProperty("user.home"), "ictdemy", "users.csv"); try { Files.createDirectories(path.getParent()); database = new Database(path); } catch (IOException ex) { Logger.getLogger(MainJFrame.class.getName()).log(Level.SEVERE, null, ex); } }
Potom vytvoríme okno formulára, pridaním nasledujúceho kódu do konštruktora:
setContentPane(panel); setTitle("Users"); setDefaultCloseOperation(EXIT_ON_CLOSE); setSize(400, 400); setLocationRelativeTo(null); setVisible(true);
Do formulára pridáme nové tlačidlo, nazveme ho saveJButton a
text mu nastavíme na Save:

Metóda
actionPerformed() tlačidla saveJButton
V click handleri tlačidla (metóde actionPerformed(), ktorou
možno vytvoriť kliknutím pravým tlačidlom myši na tlačidlo v návrhári)
pridáme do databázy dvoch užívateľov. Teraz to bude len na
skúšku, neskôr bude aplikácia vyzerať lepšie. Ďalej celú databázu
uložíme do súboru:
saveJButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { try { database.addUser("John Smith", 22, LocalDate.of(2000, 3, 21)); database.addUser("John Brown", 31, LocalDate.of(2012, 10, 30)); database.save(); } catch (IOException ex) { JOptionPane.showMessageDialog(null, "Cannot save the database, verify your access privileges to the file."); } } })
Naimportujeme si balíček
java.awt.event.ActionEvent.
Nakoniec pridáme tento kód do metódy main():
new MainJFrame();
Testovanie
Aplikáciu spustíme a klikneme na tlačidlo. Teraz otvoríme (napr. v
NotePade) súbor users.csv a vidíme, že má nasledujúci
obsah:
John Smith;22;2000-03-21 John Brown;31;2012-10-30
Všetko teda funguje, ako má 
V ďalšej lekcii , Uloženie objektov do CSV v Jave - Dokončenie, dokončíme našu objektovú formulárovú aplikáciu s databázou používateľov s použitím textových súborov vo formáte CSV.
Mal si s čímkoľvek problém? Stiahni si vzorovú aplikáciu nižšie a porovnaj ju so svojím projektom, chybu tak ľahko nájdeš.
Stiahnuť
Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkami
Stiahnuté 58x (6.88 kB)
Aplikácia je vrátane zdrojových kódov v jazyku Java
