☕ Lezione 12

Input/Output e Gestione File

File I/O: Leggere e Scrivere File

🎯 Obiettivi

⌨️ Input da Tastiera con Scanner

import java.util.Scanner;

public class InputUtente {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        
        System.out.print("Come ti chiami? ");
        String nome = scanner.nextLine();
        
        System.out.print("Quanti anni hai? ");
        int eta = scanner.nextInt();
        
        System.out.println("\nCiao " + nome + ", hai " + eta + " anni!");
        
        scanner.close();
    }
}

📖 Leggere da File

import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;

public class LetturaFile {
    public static void main(String[] args) {
        try {
            File file = new File("dati.txt");
            Scanner scanner = new Scanner(file);
            
            while (scanner.hasNextLine()) {
                String riga = scanner.nextLine();
                System.out.println(riga);
            }
            
            scanner.close();
        } catch (FileNotFoundException e) {
            System.out.println("File non trovato!");
        }
    }
}

✍️ Scrivere su File

import java.io.FileWriter;
import java.io.IOException;

public class ScritturFile {
    public static void main(String[] args) {
        try {
            FileWriter writer = new FileWriter("output.txt");
            
            writer.write("Prima riga\n");
            writer.write("Seconda riga\n");
            writer.write("Terza riga\n");
            
            writer.close();
            System.out.println("File scritto con successo!");
        } catch (IOException e) {
            System.out.println("Errore scrittura: " + e.getMessage());
        }
    }
}

📋 BufferedReader per File Grandi

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class LetturaVeloce {
    public static void main(String[] args) {
        try {
            BufferedReader reader = new BufferedReader(
                new FileReader("dati.txt")
            );
            
            String riga;
            while ((riga = reader.readLine()) != null) {
                System.out.println(riga);
            }
            
            reader.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

💾 Esempio Completo: Rubrica

import java.io.*;
import java.util.ArrayList;
import java.util.Scanner;

class Contatto {
    String nome;
    String telefono;
    
    public Contatto(String nome, String telefono) {
        this.nome = nome;
        this.telefono = telefono;
    }
    
    public String toString() {
        return nome + "," + telefono;
    }
}

public class Rubrica {
    private ArrayList contatti;
    private String nomeFile;
    
    public Rubrica(String nomeFile) {
        this.nomeFile = nomeFile;
        this.contatti = new ArrayList<>();
        caricaContatti();
    }
    
    public void aggiungiContatto(String nome, String telefono) {
        contatti.add(new Contatto(nome, telefono));
        salvaContatti();
        System.out.println("Contatto aggiunto!");
    }
    
    public void mostraContatti() {
        if (contatti.isEmpty()) {
            System.out.println("Nessun contatto");
            return;
        }
        
        System.out.println("\n=== Rubrica ===");
        for (int i = 0; i < contatti.size(); i++) {
            Contatto c = contatti.get(i);
            System.out.println((i+1) + ". " + c.nome + " - " + c.telefono);
        }
    }
    
    private void salvaContatti() {
        try {
            FileWriter writer = new FileWriter(nomeFile);
            for (Contatto c : contatti) {
                writer.write(c.toString() + "\n");
            }
            writer.close();
        } catch (IOException e) {
            System.out.println("Errore salvataggio!");
        }
    }
    
    private void caricaContatti() {
        try {
            File file = new File(nomeFile);
            if (!file.exists()) return;
            
            Scanner scanner = new Scanner(file);
            while (scanner.hasNextLine()) {
                String riga = scanner.nextLine();
                String[] parti = riga.split(",");
                if (parti.length == 2) {
                    contatti.add(new Contatto(parti[0], parti[1]));
                }
            }
            scanner.close();
        } catch (IOException e) {
            System.out.println("Errore caricamento!");
        }
    }
    
    public static void main(String[] args) {
        Rubrica rubrica = new Rubrica("rubrica.txt");
        Scanner input = new Scanner(System.in);
        
        while (true) {
            System.out.println("\n1. Aggiungi contatto");
            System.out.println("2. Mostra contatti");
            System.out.println("3. Esci");
            System.out.print("Scelta: ");
            
            int scelta = input.nextInt();
            input.nextLine(); // Consuma newline
            
            if (scelta == 1) {
                System.out.print("Nome: ");
                String nome = input.nextLine();
                System.out.print("Telefono: ");
                String tel = input.nextLine();
                rubrica.aggiungiContatto(nome, tel);
            } else if (scelta == 2) {
                rubrica.mostraContatti();
            } else if (scelta == 3) {
                break;
            }
        }
        
        input.close();
        System.out.println("Arrivederci!");
    }
}

✏️ Esercizi

Esercizio 1: Conta Parole

FACILE

Leggi un file e conta quante parole contiene

Esercizio 2: Registro Voti

MEDIO

Salva e carica voti da file con nome studente e voti

Esercizio 3: Diario

MEDIO

Crea un'applicazione per scrivere e leggere un diario da file

🎯 Concetti Chiave

  • Scanner per input tastiera e file
  • FileWriter per scrivere file
  • BufferedReader per file grandi
  • Usa try-catch per gestire IOException
  • Chiudi sempre i file con close()