Zarábaj až 6 000 € mesačne! Akreditované rekvalifikačné kurzy od 0 €. Viac informácií.
Hľadáme nové posily do ITnetwork tímu. Pozri sa na voľné pozície a pridaj sa k najagilnejšej firme na trhu - Viac informácií.

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:

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

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

 

Predchádzajúci článok
Kvíz - Základy práce so súbormi a výnimkami 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 - Dokončenie
Článok pre vás napísal Petr Štechmüller
Avatar
Užívateľské hodnotenie:
1 hlasov
Autor se věnuje primárně programování v Javě, ale nebojí se ani webových technologií.
Aktivity