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 Java tutoriále 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 sa zmienili 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. Založíme si v IntelliJ nový Java projekt 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 reprezentovať 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ď nezasvätený 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 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áš list 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);
Parameter panel
je názov panela, ktorý sme
vytvorili v návrhári.
Na formulár pridáme nové tlačidlo, pomenujeme 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. Bude to teraz na
vyskúšanie, 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 budúcej 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é 0x (6.49 kB)
Aplikácia je vrátane zdrojových kódov v jazyku Java