Java - I/O Streams: Guida per principianti

Ciao a tutti, aspiranti programmatori Java! Oggi, intraprenderemo un avventuroso viaggio nel mondo degli stream di input/output (I/O) di Java. Non preoccupatevi se siete completamente nuovi alla programmazione – sarò la vostra guida amichevole e faremo ogni passo insieme. Alla fine di questo tutorial, gestirete file e stream come un professionista!

Java - I/O Streams

Cos'sono gli stream I/O?

Prima di immergerci, diamo un'occhiata a cosa sono gli stream I/O. In Java, uno stream è una sequenza di dati. La parte "I/O" sta per Input/Output. Quindi, gli stream I/O sono il modo in cui Java gestisce la lettura e la scrittura da e verso varie fonti, come file, connessioni di rete o anche la console.

Pensa a uno stream come un fiume di dati. Puoi fare una delle seguenti cose:

  1. Prendere acqua (dati) dal fiume (input stream)
  2. Mettere acqua (dati) nel fiume (output stream)

Stream standard

Java fornisce tre stream standard già configurati per noi:

  1. System.in (Stream di input)
  2. System.out (Stream di output)
  3. System.err (Stream di output per errori)

Iniziamo con un semplice esempio:

import java.util.Scanner;

public class HelloStream {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("Come ti chiami? ");
String name = scanner.nextLine();
System.out.println("Ciao, " + name + "!");
scanner.close();
}
}

In questo esempio, utilizziamo System.in per leggere l'input dell'utente e System.out per visualizzare l'output. La classe Scanner ci aiuta a leggere dall'input stream facilmente.

Lettura e scrittura di file

Ora, passiamo a qualcosa di più interessante – lavorare con i file!

Lettura da un file

Ecco come leggere da un file:

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

public class FileReaderExample {
public static void main(String[] args) {
try (BufferedReader reader = new BufferedReader(new FileReader("example.txt"))) {
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
} catch (IOException e) {
System.err.println("Si è verificato un errore: " + e.getMessage());
}
}
}

Questo codice legge un file chiamato "example.txt" riga per riga e stampa ogni riga sulla console. La dichiarazione try-with-resources assicura che il file venga chiuso correttamente dopo aver terminato la lettura.

Scrittura su un file

Scrivere su un file è altrettanto semplice:

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

public class FileWriterExample {
public static void main(String[] args) {
try (BufferedWriter writer = new BufferedWriter(new FileWriter("output.txt"))) {
writer.write("Ciao, File I/O!");
writer.newLine();
writer.write("Questa è una nuova riga.");
} catch (IOException e) {
System.err.println("Si è verificato un errore: " + e.getMessage());
}
}
}

Questo codice crea un nuovo file chiamato "output.txt" e scrive due righe al suo interno.

FileOutputStream

A volte, potresti aver bisogno di scrivere dati binari su un file. Ecco dove FileOutputStream diventa utile:

import java.io.FileOutputStream;
import java.io.IOException;

public class FileOutputStreamExample {
public static void main(String[] args) {
try (FileOutputStream fos = new FileOutputStream("binary.dat")) {
byte[] data = {65, 66, 67, 68, 69}; // Valori ASCII per A, B, C, D, E
fos.write(data);
} catch (IOException e) {
System.err.println("Si è verificato un errore: " + e.getMessage());
}
}
}

Questo esempio scrive dati binari su un file chiamato "binary.dat".

Navigazione dei file e I/O

Java fornisce la classe File per lavorare con percorsi di file e directory. Ecco un esempio:

import java.io.File;

public class FileNavigationExample {
public static void main(String[] args) {
File file = new File("example.txt");
System.out.println("Il file esiste: " + file.exists());
System.out.println("Nome del file: " + file.getName());
System.out.println("Percorso assoluto: " + file.getAbsolutePath());
}
}

Questo codice mostra come ottenere informazioni su un file utilizzando la classe File.

Directory in Java

Lavorare con le directory è simile a lavorare con i file. Vediamo come creare una directory:

import java.io.File;

public class DirectoryExample {
public static void main(String[] args) {
File dir = new File("newDirectory");
if (dir.mkdir()) {
System.out.println("Directory creata con successo!");
} else {
System.out.println("Impossibile creare la directory.");
}
}
}

Questo codice crea una nuova directory chiamata "newDirectory" nella directory di lavoro corrente.

Elenco delle directory

Infine, vediamo come elencare il contenuto di una directory:

import java.io.File;

public class ListDirectoryExample {
public static void main(String[] args) {
File dir = new File(".");
String[] fileList = dir.list();
if (fileList != null) {
for (String fileName : fileList) {
System.out.println(fileName);
}
} else {
System.out.println("La directory non esiste o non è una directory.");
}
}
}

Questo codice elenca tutti i file e le directory nella directory corrente.

Conclusione

Congratulazioni! Avete appena fatto i vostri primi passi nel mondo degli stream di I/O di Java. Abbiamo coperto molto terreno, dalla lettura/scrittura di base ai file e alle operazioni sulle directory. Ricorda, la pratica fa il maestro, quindi non esitare a sperimentare con questi concetti.

Ecco una tabella di riferimento rapida dei metodi che abbiamo utilizzato:

Metodo Descrizione
Scanner.nextLine() Legge una riga di testo dall'input
BufferedReader.readLine() Legge una riga di testo da un file
BufferedWriter.write() Scrive una stringa su un file
BufferedWriter.newLine() Scrive un separatore di riga su un file
FileOutputStream.write() Scrive byte su un file
File.exists() Controlla se un file esiste
File.getName() Ottiene il nome di un file
File.getAbsolutePath() Ottiene il percorso assoluto di un file
File.mkdir() Crea una directory
File.list() Elenca il contenuto di una directory

Seguiamo la programmazione, la crescita e, soprattutto, divertiti! Ricorda, ogni esperto era una volta un principiante. Buon coding!

Credits: Image by storyset