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+serialVersionUIDpro serializaci objektůtransient= atribut nebude serializován