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

Lekce 4 - Uložení objektů do CSV v Javě

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

Formulář pro uložení do CSV v Javě - Soubory v Javě

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 64x (6.5 kB)
Aplikace je včetně zdrojových kódů v jazyce Java

 

Předchozí článek
Kvíz - Základy práce se soubory a výjimky v Javě
Všechny články v sekci
Soubory v Javě
Přeskočit článek
(nedoporučujeme)
Uložení objektů do CSV v Javě - Dokončení
Článek pro vás napsal Petr Štechmüller
Avatar
Uživatelské hodnocení:
37 hlasů
Autor se věnuje primárně programování v Javě, ale nebojí se ani webových technologií.
Aktivity