← Índex del curs Exercicis

Unitat 7. Persistència

Unitat Didàctica 7:

En aquesta unitat aprendràs:

Treball amb el sistema de fitxers modern de Java amb java.nio.file (Path, Files)
Lectura i escriptura de fitxers de text (Files.writeString, Files.readString, Files.readAllLines)
Gestió robusta d'excepcions d'entrada i sortida (IOException)
Formats d'intercanvi de dades: estructuració i serialització en JSON i XML
Persistència en bases de dades relacionals amb JDBC (connexió, consultes SQL i transaccions bàsiques)

1. Fitxers de text amb java.nio.file

El paquet java.nio.file és l'estàndard modern de Java per interactuar amb el sistema d'arxius d'una forma concisa, segura i d'alt rendiment. Les dues classes principals són:

Escriure a un fitxer de text

Podem escriure una cadena sencera a un fitxer amb Files.writeString():

import java.nio.file.Path; import java.nio.file.Files; import java.io.IOException; void main() { Path cami = Path.of("notes.txt"); String dades = "Anna: 9.5\nJoan: 7.0\nMarc: 8.25\n"; try { Files.writeString(cami, dades); println("Fitxer desat correctament a: " + cami.toAbsolutePath()); } catch (IOException e) { println("Error en escriure el fitxer: " + e.getMessage()); } }

Llegir d'un fitxer de text

Tenim dues maneres principals de llegir el contingut segons la comoditat de processament:

import java.nio.file.Path; import java.nio.file.Files; import java.io.IOException; import java.util.List; void main() { Path cami = Path.of("notes.txt"); try { // Opció 1: Llegir tot el fitxer en una sola cadena (String) String contingut = Files.readString(cami); println("Contingut complet:\n" + contingut); // Opció 2: Obtenir una llista amb cada línia independent List linies = Files.readAllLines(cami); for (String linia : linies) { println("Línia: " + linia); } } catch (IOException e) { println("Error en llegir el fitxer: " + e.getMessage()); } }

2. Formats d'Intercanvi de Dades: JSON i XML

Quan cal intercanviar dades estructurades entre aplicacions o persistir objectes en disc, els formats estàndard basats en text com JSON (JavaScript Object Notation) i XML (Extensible Markup Language) són els més utilitzats.

JSON (JavaScript Object Notation)

JSON s'ha convertit en l'estàndard de facto gràcies a la seva lleugeresa i claredat per a humans i màquines:

// Exemple de cadena JSON amb dades d'alumnes String jsonAlumne = """ { "id": 101, "nom": "Ariadna Soler", "actiu": true, "assignatures": ["Programació", "Bases de Dades"] } """;

En Java, biblioteques com Jackson (ObjectMapper) o Gson permeten serialitzar (convertir objectes Java a JSON) i deserialitzar (convertir JSON a instàncies d'objectes) amb una sola línia de codi.

XML (Extensible Markup Language)

XML utilitza una estructura jeràrquica basada en etiquetes niades (tags) i atributs, molt habitual en configuracions i serveis empresarials:

String xmlAlumne = """ Ariadna Soler true Programació Bases de Dades """;

3. Bases de Dades Relacionals amb JDBC

Per a aplicacions que gestionen volums elevats de dades amb consultes complexes, utilitzem un Sistema Gestor de Bases de Dades (SGBD) com SQLite, PostgreSQL o MariaDB. Java s'hi connecta a través de l'especificació JDBC (Java Database Connectivity) del paquet java.sql.

Connexió i Consulta SQL (SELECT)

import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; void main() { String url = "jdbc:sqlite:curs.db"; String sql = "SELECT id, nom, nota FROM alumnes WHERE nota >= ?"; // Ús de try-with-resources per tancar automàticament connexions i consultes try (Connection conn = DriverManager.getConnection(url); PreparedStatement stmt = conn.prepareStatement(sql)) { stmt.setDouble(1, 5.0); // Paràmetre segur per evitar injecció SQL try (ResultSet rs = stmt.executeQuery()) { while (rs.next()) { int id = rs.getInt("id"); String nom = rs.getString("nom"); double nota = rs.getDouble("nota"); println(id + " - " + nom + " (" + nota + ")"); } } } catch (SQLException e) { println("Error de base de dades: " + e.getMessage()); } }

Modificació de dades (INSERT, UPDATE, DELETE)

Per a operacions de modificació, utilitzem el mètode executeUpdate(), que retorna el nombre de files afectades:

String sqlInsert = "INSERT INTO alumnes (nom, nota) VALUES (?, ?)"; try (Connection conn = DriverManager.getConnection(url); PreparedStatement stmt = conn.prepareStatement(sqlInsert)) { stmt.setString(1, "Clara Pons"); stmt.setDouble(2, 9.1); int filesAfectades = stmt.executeUpdate(); println("Alumne inserit correctament! Files modificades: " + filesAfectades); } catch (SQLException e) { println("Error en inserir l'alumne: " + e.getMessage()); }

Exercicis Pràctics i Reptes

Posa en pràctica la persistència creant lectors de fitxers, utilitats CSV/JSON i consultes JDBC.

Exercicis