Panoramica
In questo tutorial, esploreremo diversi modi di leggere da un file in Java .
In primo luogo, impareremo come caricare un file dal classpath, un URL o da un file JAR utilizzando classi Java standard.
In secondo luogo, vedremo come per leggere il contenuto con BufferedReader, Scanner, StreamTokenizer, DataInputStream, SequenceInputStream e FileChannel. Discuteremo anche come leggere un file codificato UTF-8.
Infine, esploreremo le nuove tecniche per caricare e leggi un file in Java 7 e Java 8.
Questo articolo fa parte della serie “Java – Back to Basic” su Baeldung.
Ulteriore lettura:
Java – Crea un file
Java – Scrivi su file
Configurazione
2.1 File di input
Nella maggior parte degli esempi in questo articolo, leggeremo un file di testo con nome file fileTest.txt che contiene una riga:
Per alcuni esempi, utilizzeremo un file diverso; in questi casi, menzioneremo esplicitamente il file e il suo contenuto.
2.2 Metodo di aiuto
Useremo una serie di esempi di test con core Solo classi Java e nei test utilizzeremo asserzioni con gli abbinamenti Hamcrest.
I test condivideranno un metodo readFromInputStream comune che trasforma un InputStream in String per una più facile asserzione dei risultati:
Nota che ci sono altri modi per ottenere lo stesso risultato. Possiamo consultare questo articolo per alcune alternative.
Leggere un file dal Classpath
3.1 Utilizzo di Java standard
Questa sezione spiega come leggere un file disponibile su un classpath. Leggeremo “fileTest.txt” disponibile in src / main / resources :
Nello snippet di codice sopra, abbiamo utilizzato la classe corrente per caricare un file utilizzando il metodo getResourceAsStream e passato il percorso assoluto del file da caricare.
Lo stesso metodo è disponibile su anche un’istanza di ClassLoader:
Otteniamo classLoa der della classe corrente utilizzando getClass (). getClassLoader ().
La differenza principale è che quando si utilizza getResourceAsStream su un’istanza ClassLoader, il percorso viene considerato assoluto a partire dalla radice del classpath.
Se usato contro un’istanza di Class, il percorso potrebbe essere relativo al pacchetto, o un percorso assoluto, che è suggerito dalla barra iniziale.
Ovviamente, nota che in pratica , i flussi aperti dovrebbero essere sempre chiusi, come InputStream nel nostro esempio:
3.2. Usare la libreria commons-io
Un’altra opzione comune è usare la classe FileUtils del pacchetto commons-io:
Qui passiamo l’oggetto File al metodo readFileToString () della classe FileUtils. Questa classe di utilità riesce a caricare il contenuto senza la necessità di scrivere alcun codice boilerplate per creare un’istanza InputStream e leggere i dati.
La stessa libreria offre anche la classe IOUtils:
Qui noi passare l’oggetto FileInputStream al metodo toString () della classe IOUtils. Questa classe di utilità agisce nello stesso modo della precedente per creare un’istanza InputStream e leggere i dati.
Lettura con BufferedReader
Ora lascia ” si concentrano su diversi modi per analizzare il contenuto di un file.
Inizieremo con un modo semplice per leggere da un file usando BufferedReader:
Nota che readLine () restituirà null quando viene raggiunta la fine del file.
Lettura da un file utilizzando Java NIO
In JDK7, il pacchetto NIO è stato notevolmente aggiornato.
Diamo un’occhiata a un esempio utilizzando la classe Files e il metodo readAllLines. Il metodo readAllLines accetta un Path.
La classe Path può essere considerata un aggiornamento di java.io.File con alcune operazioni aggiuntive in atto.
5.1. Leggere un piccolo file
Il codice seguente mostra come leggere un piccolo file usando la nuova classe Files:
Nota che possiamo usare readAllBytes () anche il metodo se abbiamo bisogno di dati binari.
5.2. Leggere un file di grandi dimensioni
Se vogliamo leggere un file di grandi dimensioni con la classe Files, possiamo usare BufferedReader.
Il codice seguente legge il file usando la nuova classe Files e BufferedReader:
5.3. Leggere un file usando Files.lines ()
JDK8 offre il metodo lines () all’interno della classe Files. Restituisce un flusso di elementi String.
Diamo un’occhiata a un esempio di come leggere i dati in byte e decodificarli usando il set di caratteri UTF-8.
Il codice seguente legge il file usando il nuovo Files.lines ():
Usando Stream con canali IO come le operazioni sui file, dobbiamo chiudere lo stream esplicitamente usando il metodo close ().
Come possiamo vedere, l’API Files offre un altro modo semplice per leggere il contenuto del file in una stringa.
Nelle sezioni successive, esamineremo altri metodi meno comuni di leggere un file che potrebbe essere appropriato in alcune situazioni.
Leggere con lo scanner
Quindi usiamo uno scanner per leggere dal file. Qui useremo gli spazi bianchi come delimitatori:
Nota che il delimitatore predefinito è lo spazio bianco, ma più delimitatori possono essere usati con uno Scanner.
La classe Scanner è utile durante la lettura contenuto dalla console, o quando il contenuto contiene valori primitivi, con un delimitatore noto (ad esempio: un elenco di numeri interi separati da spazio).
Lettura con StreamTokenizer
Ora leggiamo un file di testo in token utilizzando uno StreamTokenizer.
Il tokenizer funziona prima di tutto capire qual è il token successivo, stringa o numero. Lo facciamo guardando il campo tokenizer.ttype.
Quindi leggeremo il token effettivo in base a questo tipo:
- tokenizer.nval – se il tipo era un numero
- tokenizer.sval – se il tipo era una stringa
In questo esempio, useremo un file di input diverso che contiene semplicemente:
Il codice seguente legge dal file sia la stringa che il numero:
Nota come viene utilizzata la fine del token di file alla fine.
Questo approccio è utile per analizzare un flusso di input in token.
Lettura con DataInputStream
Possiamo usare DataInputStream per leggere binario o tipi di dati primitivi da un file.
Il seguente test legge il file utilizzando un DataInputStream:
Lettura con FileChannel
Se noi stanno leggendo un file di grandi dimensioni, FileChannel può essere più veloce dell’IO standard.
Il codice seguente legge i byte di dati dal file utilizzando FileChannel e RandomAccessFile:
Lettura di una codifica UTF-8 ed File
Ora vediamo come leggere un file codificato UTF-8 usando BufferedReader. In questo esempio, leggeremo un file che contiene caratteri cinesi:
Lettura di contenuti da URL
Per leggere contenuti da un URL, useremo URL “/” nel nostro esempio:
Esistono anche modi alternativi per connettersi a un URL. Qui abbiamo utilizzato l’URL e la classe URLConnection disponibili nell’SDK standard.
Lettura di un file da un JAR
Per leggere un file che si trova all’interno di un JAR, avremo bisogno di un JAR con un file al suo interno. Per il nostro esempio, leggeremo “LICENSE.txt” dal file “hamcrest-library-1.3.jar”:
Qui vogliamo caricare LICENSE.txt che risiede nella libreria Hamcrest, quindi useremo la classe Matcher che aiuta a ottenere una risorsa. Lo stesso file può essere caricato anche utilizzando il classloader.
Conclusione
Come possiamo vedere, ci sono molte possibilità per caricare un file e leggere i dati da esso utilizzando Java semplice.
Possiamo caricare un file da varie posizioni come classpath, URL o file jar.
Quindi noi può utilizzare BufferedReader per leggere riga per riga, Scanner per leggere utilizzando diversi delimitatori, StreamTokenizer per leggere un file in token, DataInputStream per leggere dati binari e tipi di dati primitivi, SequenceInput Stream per collegare più file in un flusso, FileChannel per leggere più velocemente da grandi file, ecc.