IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

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".

Formulár pre uloženie do CSV v Jave - Práca so súbormi v Jave

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 podmienkami

Stiahnuté 64x (6.5 kB)

 

Predchádzajúci článok
Práca s textovými súbormi v Jave
Všetky články v sekcii
Práca so súbormi v Jave
Preskočiť článok
(neodporúčame)
Uloženie objektov do CSV v Jave časť 2
Článok pre vás napísal Petr Štechmüller
Avatar
Užívateľské hodnotenie:
Ešte nikto nehodnotil, buď prvý!
Autor se věnuje primárně programování v Javě, ale nebojí se ani webových technologií.
Aktivity