Gestione dei file in Java
Il metodo int read() viene utilizzato per leggere un carattere/byte alla volta e restituisce un valore di tipo int. Questo valore corrisponde al codice del carattere/byte letto oppure -1 se non ci sono più dati da leggere.
Percorsi relativi e assoluti
C'è una distinzione tra percorso relativo e percorso assoluto perché dobbiamo sempre considerare il contesto in cui il software opera. Ad esempio, se un'applicazione Java legge da un file e salva il file in una cartella, il percorso assoluto funziona sempre poiché il file system del sistema operativo gestisce le operazioni come "apri una certa cartella" o "crea questo file". Tuttavia, l'utilizzo di un percorso assoluto è sconsigliato quando si distribuisce il software, poiché potrebbe non funzionare su altri dispositivi. Invece, i percorsi relativi permettono al software di essere più portabile e funzionare correttamente su diverse macchine.
Un percorso relativo esprime la posizione di una risorsa rispetto alla posizione corrente. Ad esempio, se si crea un file di nome writer.java nella cartella X, il suo percorso relativo per un file prova.txt sarà semplice: basta specificare il nome del file, poiché si trovano nella stessa cartella.
Buffer e gestione dei flussi
Un BufferedReader permette di gestire un flusso tramite un buffer, leggendo dati a blocchi e memorizzandoli in memoria. Prima di leggere un nuovo dato, verifica la disponibilità nel buffer. Un PrintWriter offre i metodi void print() e void println() per scrivere dati di vari tipi. È possibile creare un nuovo oggetto PrintWriter a partire da un Writer, in particolare da un FileWriter.
File CSV e gestione dei dati
Il formato CSV (Comma-Separated Values) permette di strutturare i dati usando caratteri di separazione. Il CSV è un file in cui la struttura emerge dalla presenza di separatori, come virgole, punti e virgola, o spazi. Il vantaggio dei CSV è che i dati sono organizzati in modo leggibile e facilmente parsabile dai programmi.
StringTokenizer e StringBuilder
La classe StringTokenizer separa una stringa in sottostringhe dette token. È utile per dividere una stringa alla base di un separatore definito. La classe StringBuilder, invece, è una sequenza mutabile di caratteri che permette modifiche senza ricreare l'oggetto, risultando più efficiente in termini di risorse computazionali rispetto alla concatenazione di stringhe.
Sia StringBuilder che StringBuffer condividono metodi simili, ma StringBuffer è sincronizzato, rendendolo più sicuro per applicazioni multithread.