Leggi un file in un ArrayList

1. Panoramica

In questo tutorial, discuteremo diversi modi di leggere un file in un ArrayList .

Esistono molti modi per leggere un file in Java. Una volta letto un file, possiamo eseguire molte operazioni sul contenuto di quel file.

Alcune di queste operazioni, come l'ordinamento, potrebbero richiedere l'elaborazione dell'intero contenuto del file in memoria. Per eseguire tali operazioni, potrebbe essere necessario leggere il file come un array o un elenco di righe o parole.

2. Utilizzo di FileReader

Il modo più semplice per leggere un file in Java è utilizzare FileReader . Per definizione, FileReader è una classe di convenienza per la lettura del flusso di caratteri da un file.

Sono disponibili più costruttori per inizializzare un FileReader:

FileReader f = new FileReader(String filepath); FileReader f = new FileReader(File f); FileReader f = new FileReader(FileDescriptor fd);

Tutti questi costruttori presumono che la codifica dei caratteri predefinita e la dimensione del byte-buffer predefinita siano appropriate.

Tuttavia, se vogliamo fornire la codifica dei caratteri personalizzata e la dimensione del buffer di byte, possiamo usare InputStreamReader o FileInputStream .

Nel codice seguente, dimostreremo come leggere le righe da un file in un ArrayList, utilizzando FileReader:

ArrayList result = new ArrayList(); try (FileReader f = new FileReader(filename)) { StringBuffer sb = new StringBuffer(); while (f.ready()) { char c = (char) f.read(); if (c == '\n') { result.add(sb.toString()); sb = new StringBuffer(); } else { sb.append(c); } } if (sb.length() > 0) { result.add(sb.toString()); } } return result;

3. Utilizzo di BufferedReader

Sebbene FileReader sia abbastanza facile da usare, è consigliabile includerlo sempre con BuffereReader , durante la lettura di un file.

Questo perché BufferedReader utilizza un buffer char per leggere simultaneamente più valori da un flusso di input di caratteri e quindi riduce il numero di chiamate read () effettuate dal FileStream sottostante .

I costruttori per BufferedReader accettano Reader come input. Inoltre, possiamo anche fornire la dimensione del buffer nei costruttori, ma, per la maggior parte dei casi d'uso, la dimensione predefinita è abbastanza grande:

BufferedReader br = new BufferedReader(new FileReader(filename)); BufferedReader br = new BufferedReader(new FileReader(filename), size);

Oltre ai metodi ereditati dalla classe Reader , BufferedReader fornisce anche il metodo readLine () , per leggere un'intera riga come String:

ArrayList result = new ArrayList(); try (BufferedReader br = new BufferedReader(new FileReader(filename))) { while (br.ready()) { result.add(br.readLine()); } } 

4. Utilizzo dello scanner

Un altro modo comune di leggere i file è tramite Scanner .

Scanner è un semplice scanner di testo, utilizzato per analizzare tipi e stringhe primitive, utilizzando espressioni regolari.

Durante la lettura dei file, Scanner viene inizializzato utilizzando oggetti File o FileReader :

Scanner s = new Scanner(new File(filename)); Scanner s = new Scanner(new FileReader(filename));

Simile a BufferedReader, Scanner fornisce il metodo readLine () per leggere un'intera riga . Inoltre , fornisce anche un metodo hasNext () per indicare se sono disponibili più valori per la lettura o meno:

ArrayList result = new ArrayList(); try (Scanner s = new Scanner(new FileReader(filename))) { while (s.hasNext()) { result.add(s.nextLine()); } return result; }

Lo scanner suddivide il suo input in token utilizzando un delimitatore, il delimitatore predefinito è uno spazio bianco. Questi token possono essere convertiti in valori di diverso tipo, utilizzando vari metodi next ( nextInt , nextLong , ecc.) Disponibili:

ArrayList result = new ArrayList(); try (Scanner s = new Scanner(new FileReader(filename))) { while (s.hasNext()) { result.add(s.nextInt()); } return result; }

5. Utilizzo di Files.readAllLines

Probabilmente il modo più semplice per leggere un file e analizzare tutte le sue righe in un ArrayList , è usare il metodo readAllLines () disponibile nella classe Files :

List result = Files.readAllLines(Paths.get(filename));

Questo metodo può anche accettare un parametro charset, da leggere secondo una codifica di caratteri specifica:

Charset charset = Charset.forName("ISO-8859-1"); List result = Files.readAllLines(Paths.get(filename), charset);

6. Conclusione

Per riassumere, abbiamo discusso alcuni modi comuni di leggere il contenuto di un file in un ArrayList . Inoltre, abbiamo coperto alcuni vantaggi e svantaggi dei vari metodi.

Ad esempio, possiamo usare BufferedReader per memorizzare i caratteri per l'efficienza. In alternativa, potremmo usare Scanner per leggere la primitiva usando i delimitatori. O forse, potremmo semplicemente usare Files.readAllLines (), senza preoccuparci dell'implementazione sottostante.

Come al solito, il codice è disponibile nel nostro repository GitHub.