0Pricing
Java Academy · Lezione

Chiusura sicura degli stream

try-with-resources

Chiusura sicura degli stream è una lezione Java Academy gratuita su CoddyKit. Questa è la lezione 4 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Java Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Java Academy include 4 lezioni in totale.

Perché chiudere i flussi

I flussi come BufferedReader mantengono impegnate risorse di sistema — handle di file, buffer di memoria, connessioni. Se non li chiude mai, queste risorse possono andare perse.

Chiudere un flusso libera ciò che contiene e svuota i dati in attesa. In questa lezione vedrà come farlo in sicurezza.

Il metodo close

Ogni lettore dispone di un metodo close(). Chiamarlo rilascia la risorsa.

Per un BufferedReader che avvolge System.in, la chiusura chiude anche i flussi sottostanti che avvolge.

BufferedReader br =
    new BufferedReader(new InputStreamReader(System.in));
// ... use br ...
br.close();

Il vecchio metodo rischioso

Potrebbe chiamare close() manualmente, ma se si verifica un errore prima dell'esecuzione di quella riga, close() viene ignorato e la risorsa va persa.

Inserire close() in un blocco finally aiuta, ma è verboso e facile da implementare in modo errato.

BufferedReader br = null;
try {
    br = new BufferedReader(
        new InputStreamReader(System.in));
    // ... use br ...
} finally {
    if (br != null) br.close();
}

try-with-resources

Java offre una soluzione più pulita: try-with-resources. Dichiara il flusso tra parentesi dopo try e Java lo chiude automaticamente al termine del blocco — anche se si verifica un errore.

Niente finally, nessuna chiamata manuale a close(). Questa è la procedura consigliata moderna.

try (BufferedReader br =
        new BufferedReader(new InputStreamReader(System.in))) {
    String line = br.readLine();
    System.out.println(line);
}

Come funziona

Ogni risorsa dichiarata tra le parentesi try (...) deve implementare AutoCloseable. BufferedReader lo fa, quindi Java chiama close() al posto Suo.

La chiusura avviene dopo la fine del blocco, sia che termini normalmente sia che termini a causa di un'eccezione.

Un esempio completo

Ecco un programma completo che usa try-with-resources per leggere una riga. Il lettore viene chiuso automaticamente alla fine del blocco.

Legge da System.in, quindi attende l'input e qui non può essere eseguito automaticamente.

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;

public class Main {
    public static void main(String[] args) throws IOException {
        try (BufferedReader br = new BufferedReader(
                new InputStreamReader(System.in))) {
            String name = br.readLine();
            System.out.println("Hi " + name);
        }
    }
}

Eseguibile con StringReader

Per dimostrare che try-with-resources funziona senza input da tastiera, qui il programma legge da un StringReader. È completamente eseguibile.

Dopo il blocco, il lettore viene chiuso automaticamente — non deve scrivere alcuna chiamata a close().

import java.io.BufferedReader;
import java.io.StringReader;
import java.io.IOException;

public class Main {
    public static void main(String[] args) throws IOException {
        try (BufferedReader br =
                new BufferedReader(new StringReader("done"))) {
            System.out.println(br.readLine());
        }
    }
}

Più risorse

Può dichiarare diverse risorse in un unico try, separandole con punti e virgola. Java le chiude tutte nell'ordine inverso rispetto alla dichiarazione.

È utile quando avvolge più flussi uno nell'altro.

try (InputStreamReader isr =
        new InputStreamReader(System.in);
     BufferedReader br = new BufferedReader(isr)) {
    System.out.println(br.readLine());
}

Gestire IOException

La lettura può generare IOException. Può aggiungere un catch a un blocco try-with-resources per gestirla invece di dichiarare throws.

La risorsa viene comunque chiusa automaticamente prima dell'esecuzione di catch.

try (BufferedReader br = new BufferedReader(
        new InputStreamReader(System.in))) {
    System.out.println(br.readLine());
} catch (IOException e) {
    System.out.println("Read failed");
}

È necessario chiudere System.in?

Una precisazione: chiudere un lettore su System.in chiude anche System.in stesso, e non è possibile riaprirlo.

Per i programmi brevi va bene così. Tuttavia, se in seguito ha ancora bisogno dell'input dalla console, non chiuda quel lettore specifico. È importante sapere cosa avvolge il flusso.

Procedure consigliate

Per gestire i flussi in sicurezza:

  • Preferisca try-with-resources a close() manuale.
  • Chiude automaticamente le risorse anche quando si verificano errori.
  • Ricordi che chiudere un lettore di System.in chiude l'input standard.

Una gestione corretta delle risorse previene perdite e bug.

Verifica rapida

Rifletta sul vantaggio principale di try-with-resources.

Riepilogo

Ha imparato perché è necessario chiudere i flussi, quali rischi presenta l'approccio manuale con finally e qual è il modello più pulito try-with-resources, che chiude automaticamente le risorse AutoCloseable.

Ora può leggere l'input con BufferedReader in sicurezza, dall'inizio alla fine.

Domande Frequenti

La lezione «Chiusura sicura degli stream» è gratuita?

Sì — il testo completo di «Chiusura sicura degli stream» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Java Academy, passa a CoddyKit PRO. Il corso Java Academy include 4 lezioni in totale.

Cosa imparerò in «Chiusura sicura degli stream»?

try-with-resources Eserciti Java Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare Java Academy?

Non è richiesta alcuna esperienza precedente. Java Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 4 di 4.

Quanto tempo richiede la lezione «Chiusura sicura degli stream»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione Java Academy?

Sì. Ogni lezione Java Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. Perché BufferedReader
  2. Lettura delle righe
  3. Analisi dei numeri dall'input
  4. Chiusura sicura degli stream
← Torna a Java Academy