Perzistentní ukládání dat

Proč to potřebuji?

Bez perzistence data zmizí po ukončení programu. Práce se soubory, I/O proudy a serializace jsou základní dovednosti pro ukládání a načítání dat v jakékoliv reálné aplikaci.

Teorie

I/O proudy (streams): bajtové (InputStream/OutputStream) a znakové (Reader/Writer). Buffered varianty zvyšují výkon.

Serializace: převod objektu na proud bajtů (Serializable) pro uložení/přenos. Deserializace = obnova objektu.

java.nio.file.Files a Path – moderní API pro práci se soubory.

Příklady

import java.io.*;
import java.nio.file.*;
import java.util.List;

// === Textový soubor – zápis ===
try (BufferedWriter writer = new BufferedWriter(new FileWriter("data.txt"))) {
    writer.write("První řádek");
    writer.newLine();
    writer.write("Druhý řádek");
}

// === Textový soubor – čtení ===
try (BufferedReader reader = new BufferedReader(new FileReader("data.txt"))) {
    String radek;
    while ((radek = reader.readLine()) != null) {
        System.out.println(radek);
    }
}

// === Moderní NIO – jednodušší API ===
Path cesta = Path.of("data.txt");

// Zápis
Files.writeString(cesta, "Obsah souboru");
Files.write(cesta, List.of("Řádek 1", "Řádek 2"));

// Čtení
String obsah = Files.readString(cesta);
List<String> radky = Files.readAllLines(cesta);

// === Serializace – uložení objektu ===
public class Student implements Serializable {
    private static final long serialVersionUID = 1L;
    private String jmeno;
    private int vek;
    private transient String heslo; // transient = nebude serializováno

    public Student(String jmeno, int vek, String heslo) {
        this.jmeno = jmeno;
        this.vek = vek;
        this.heslo = heslo;
    }
}

// Serializace (zápis)
Student student = new Student("Jan", 21, "tajne123");
try (ObjectOutputStream oos = new ObjectOutputStream(
        new FileOutputStream("student.dat"))) {
    oos.writeObject(student);
}

// Deserializace (čtení)
try (ObjectInputStream ois = new ObjectInputStream(
        new FileInputStream("student.dat"))) {
    Student nacteny = (Student) ois.readObject();
    // nacteny.heslo == null (transient)
}

Shrnutí

Klíčové body

  • Buffered I/O: BufferedReader/BufferedWriter – efektivní čtení/zápis
  • NIO: Files.readString(), Files.write() – jednodušší API
  • Serializable + serialVersionUID pro serializaci objektů
  • transient = atribut nebude serializován