Seleziona una pagina

Guida completa alla lettura di file in Java e alla manipolazione delle stringhe con split

In Java esistono diverse modalità per leggere dati da uno stream, sia esso un file o un socket, ognuna indicata in base alle operazioni che vogliamo eseguire. Le classi che derivano dalle classi astratte Reader e Writer, che chiameremo più comodamente ‘lettori’ e ‘scrittori’, sono utili per lavorare con il formato testo.

Schema delle classi Reader e Writer in Java

Lettura di file riga per riga

La classe BufferedReader permette di leggere righe di testo in modo efficiente. L'apertura del file avviene con la creazione dell'oggetto di classe FileReader che, se il file non esiste, lancia un'eccezione FileNotFoundException a gestione obbligatoria. La classe BufferedReader gestisce invece la possibilità che si verifichino dei malfunzionamenti che possano interrompere lo stream, lanciando un'eccezione di classe IOException.

Ecco un esempio di lettura riga per riga:

BufferedReader fin = new BufferedReader(new FileReader("nomeFile.txt"));String riga;while((riga = fin.readLine()) != null) { // Elaborazione della riga}

In alternativa, la classe Scanner, appartenente al package java.util, viene introdotta per la sua versatilità:

Scanner fin = new Scanner(new FileReader("nomeFile.txt"));String riga;while(fin.hasNextLine()){ riga = fin.nextLine(); // Elaborazione della riga}

JAVA: Sorgenti e destinazioni dei flussi di Input/Output (M12-E02)

Il metodo String.split: dividere le stringhe

In Java, il metodo split suddivide una stringa in sottostringhe utilizzando un delimitatore definito tramite un'espressione regolare. Il metodo restituisce un array di stringhe. È utilissimo quando dobbiamo dividere una stringa nelle sue parti componenti con l'aiuto di un delimitatore speciale.

Parametri e funzionamento

Il parametro di input regex è un'espressione regolare applicata alla stringa originale. Spesso capita di avere stringhe generate secondo regole precise; in queste situazioni, il programmatore conosce le "regole del gioco".

Esempi pratici di utilizzo

Se vogliamo utilizzare un carattere speciale come delimitatore, ad esempio la pipe "|", dobbiamo prestare attenzione poiché nelle espressioni regolari ha un significato speciale. Dobbiamo quindi eseguire l'escape con due barre rovesciate: "\\|".

Consideriamo un esempio complesso: calcolare il costo totale di un ordine partendo da una stringa formattata. Il primo passo è dividere la stringa usando ";" come delimitatore per scomporlo nelle sue parti componenti. Quindi, per ogni prodotto, suddivideremo le informazioni utilizzando il simbolo ",". Prenderemo l'elemento corrispondente al prezzo, lo convertiremo in forma numerica e calcoleremo il totale.

Delimitatore Risultato atteso
Virgola (,) Possibili spazi iniziali nelle sottostringhe
Virgola e spazio (, ) Nessuno spazio iniziale nelle sottostringhe
Diagramma di flusso del metodo split con regex

Gestione dei parametri limite

Il metodo split accetta un parametro limit opzionale che determina quante volte il modello regex verrà applicato:

  • limit > 0: Il modello viene applicato limit - 1 volte. La lunghezza dell'array risultante non supererà il valore del parametro.
  • limit < 0: L'espressione regolare viene applicata il maggior numero di volte possibile; l'array risultante può avere qualsiasi lunghezza.
  • limit = 0: Comportamento simile al caso precedente, ma le stringhe vuote finali vengono scartate.

Ricordiamo infine che, a seconda del sistema operativo, i caratteri di fine riga possono variare: Unix/Linux usa Line Feed (LF), mentre Windows/DOS usa Carriage Return/Line Feed (CR/LF).

tags: #leggere #da #file #java #split