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:
Path: Representa la ruta d'un fitxer o directori (relativa o absoluta). Es crea habitualment amb Path.of("nom_fitxer.txt").
Files: Conté mètodes estàtics per operar sobre fitxers (crear, llegir, escriure, copiar, eliminar).
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