In Java, il concetto di “stream” e “buffer” sono fondamentali per la gestione efficiente dell’input e dell’output di dati. Vediamo cosa sono e come vengono utilizzati.
Un buffer è una zona di memoria temporanea utilizzata per archiviare dati durante il loro trasferimento tra due luoghi. Nel contesto di Java, i buffer sono spesso utilizzati per migliorare le prestazioni durante la lettura o la scrittura di dati da o verso un file o un’altra fonte/destinazione.
Esempio Lettura:
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
public class LeggiFileJava {
public static void main(String[] args) {
String percorsoFile = "percorso_del_tuo_file.txt";
try (BufferedReader reader = new BufferedReader(new FileReader(percorsoFile))) {
String linea;
while ((linea = reader.readLine()) != null) {
System.out.println(linea);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
Esempio Scrittura:
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
public class ScriviSuFileJava {
public static void main(String[] args) {
String percorsoFile = "percorso_del_tuo_file.txt";
try (BufferedWriter writer = new BufferedWriter(new FileWriter(percorsoFile))) {
writer.write("Prima linea di testo");
writer.newLine(); // Aggiungi una nuova linea
writer.write("Seconda linea di testo");
System.out.println("Scrittura su file completata.");
} catch (IOException e) {
e.printStackTrace();
}
}
}
Gli “stream” in Java sono flussi di dati che permettono la lettura e la scrittura sequenziale di dati. Ci sono due tipi principali di stream: ByteStream e CharacterStream.
Questo tipo di stream è utilizzato per elaborare dati byte per byte (8 bit). Le classi più comuni in questo contesto sono FileInputStream e FileOutputStream. Il FileInputStream è utilizzato per leggere da una fonte, mentre il FileOutputStream è utilizzato per scrivere su una destinazione. Ecco una lista delle varie classi ByteStream:
FileInputStream
: Legge byte da un file.FileOutputStream
: Scrive byte su un file.Esempio Lettura e Scrittura:
import java.io.*;
public class ByteStream {
public static void main(String[] args) throws IOException {
// dichiarazione degli Stream
FileInputStream sourceStream = null;
FileOutputStream targetStream = null;
try {
sourceStream = new FileInputStream("percorso_file_mittente.txt");
targetStream = new FileOutputStream("percorso_file_destinatario.txt");
// Lettura del contenuto del file di partenza e scrittura nel file
// di destinazione byte per byte
int data;
while ((data = sourceStream.read()) != -1) {
targetStream.write((byte)data);
}
} finally {
// chiusura degli Stream
if (sourceStream != null)
sourceStream.close();
if (targetStream != null)
targetStream.close();
}
}
}
INFO
Il blocco finally
viene eseguito sempre, indipendentemente dal fatto che ci sia un’eccezione o meno. Questo è importante per assicurarsi che, anche in caso di eccezioni, le risorse vengano comunque chiuse correttamente.
In Java, i caratteri sono memorizzati utilizzando le convenzioni Unicode. Gli stream di caratteri ci permettono di leggere e scrivere dati carattere per carattere. Le classi più comuni in questo contesto sono FileReader e FileWriter. FileReader è utilizzato per leggere da una fonte, mentre FileWriter è utilizzato per scrivere su una destinazione.
Esempio Lettura e Scrittura:
import java.io.*;
public class CharacterStream {
public static void main(String[] args) throws IOException {
// dichiarazione degli Stream
FileReader sourceStream = null;
FileWriter destinationStream = null;
try {
sourceStream = new FileReader("percorso_file_mittente.txt");
destinationStream = new FileWriter("percorso_file_destinatario.txt");
// Lettura del contenuto del file di partenza e scrittura nel file
// di destinazione carattere per carattere
int data;
while ((data = sourceStream.read()) != -1) {
destinationStream.write(data);
}
} finally {
// Chiusura Stream
if (sourceStream != null)
sourceStream.close();
if (destinationStream != null)
destinationStream.close();
}
}
}