Oversikt
I denne veiledningen vil vi utforske forskjellige måter å lese fra en fil i Java .
Først lærer vi hvordan du laster inn en fil fra klassestien, en URL eller fra en JAR-fil ved hjelp av standard Java-klasser.
For det andre vil vi se hvordan for å lese innholdet med BufferedReader, Scanner, StreamTokenizer, DataInputStream, SequenceInputStream og FileChannel. Vi vil også diskutere hvordan du leser en UTF-8-kodet fil.
Til slutt vil vi utforske de nye teknikkene for å laste inn og les en fil i Java 7 og Java 8.
Denne artikkelen er en del av «Java – Back to Basic» -serien på Baeldung.
Ytterligere lesing:
Java – Opprett en fil
Java – Skriv til fil
Oppsett
2.1 Inngangsfil
I de fleste eksempler i denne artikkelen vil vi lese en tekstfil med filnavn fileTest.txt som inneholder en linje:
For noen få eksempler bruker vi en annen fil; i disse tilfellene nevner vi filen og innholdet eksplisitt.
2.2 Hjelpemetode
Vi bruker et sett med testeksempler med kjerne Bare Java-klasser, og i testene bruker vi påstander med Hamcrest-matchere.
Tester vil dele en vanlig readFromInputStream-metode som forvandler en InputStream til String for lettere å hevde resultatene:
Vær oppmerksom på at det er andre måter å oppnå samme resultat på. Vi kan se i denne artikkelen for noen alternativer.
Lesing av en fil fra Classpath
3.1 . Bruke standard Java
Dette avsnittet forklarer hvordan du leser en fil som er tilgjengelig på en klassebane. Vi leser «fileTest.txt» tilgjengelig under src / main / resources :
I kodebiten ovenfor brukte vi den gjeldende klassen til å laste inn en fil ved hjelp av getResourceAsStream-metoden og passerte den absolutte banen til filen som skal lastes inn.
Den samme metoden er tilgjengelig på en ClassLoader-forekomst også:
Vi får classLoa der av gjeldende klasse ved hjelp av getClass (). getClassLoader ().
Hovedforskjellen er at når du bruker getResourceAsStream på en ClassLoader-forekomst, blir banen behandlet som absolutt med utgangspunkt fra roten til klassestien.
Når den brukes mot en klasseinstans, kan banen være relativt til pakken, eller en absolutt bane, noe som er antydet av det ledende skråstrek.
Merk deg selvfølgelig at i praksis , skal åpne strømmer alltid være stengt, for eksempel InputStream i vårt eksempel:
3.2. Bruke commons-io-biblioteket
Et annet vanlig alternativ er å bruke FileUtils-klassen til commons-io-pakken:
Her sender vi filobjektet til metoden readFileToString () av FileUtils-klassen. Denne verktøysklassen klarer å laste innholdet uten at det er nødvendig å skrive noen kokerplatekode for å lage en InputStream-forekomst og lese data.
Samme bibliotek tilbyr også IOUtils-klassen:
Her vi send FileInputStream-objektet til metoden toString () av IOUtils-klassen. Denne verktøysklassen fungerer på samme måte som den forrige for å lage en InputStream-forekomst og lese data.
Lesing med BufferedReader
La oss nå » s fokus på forskjellige måter å analysere innholdet i en fil på.
Vi begynner med en enkel måte å lese fra en fil ved hjelp av BufferedReader:
Merk at readLine () kommer tilbake null når slutten av filen er nådd.
Lesing fra en fil ved bruk av Java NIO
I JDK7 ble NIO-pakken betydelig oppdatert.
La oss se på et eksempel ved bruk av Files-klassen og readAllLines-metoden. ReadAllLines-metoden godtar en bane.
Baneklasse kan betraktes som en oppgradering av java.io-filen med noen ekstra operasjoner på plass.
5.1. Lese en liten fil
Følgende kode viser hvordan du leser en liten fil ved hjelp av den nye Files-klassen:
Merk at vi kan bruke readAllBytes () metoden også hvis vi trenger binære data.
5.2. Lese en stor fil
Hvis vi vil lese en stor fil med Files-klassen, kan vi bruke BufferedReader.
Følgende kode leser filen ved hjelp av den nye Files-klassen og BufferedReader:
5.3. Å lese en fil ved hjelp av Files.lines ()
JDK8 tilbyr linjene () -metoden i Files-klassen. Den returnerer en strøm av strengelementer.
La oss se på et eksempel på hvordan du leser data i byte og dekoder dem ved hjelp av UTF-8-tegnsett.
Følgende kode leser filen ved hjelp av de nye Files.lines ():
Ved å bruke Stream med IO-kanaler som filoperasjoner, må vi lukke strømmen eksplisitt ved hjelp av close () -metoden.
Som vi kan se, tilbyr Files API en annen enkel måte å lese filinnholdet inn i en streng.
I de neste avsnittene vil vi se på andre mindre vanlige metoder for lese en fil som kan være passende i noen situasjoner.
Lesing med skanner
Neste, la oss bruke en skanner til å lese fra filen. Her skal vi bruke mellomrom som skilletegn:
Merk at standard skilletegn er det hvite området, men flere skillelinjer kan brukes med en skanner.
Skannerklassen er nyttig når du leser innhold fra konsollen, eller når innholdet inneholder primitive verdier, med en kjent avgrenser (f.eks. en liste over heltall atskilt med mellomrom).
Lesing med StreamTokenizer
La oss nå lese en tekstfil i tokens ved hjelp av en StreamTokenizer.
Tokenizer fungerer ved først å finne ut hva neste token er, streng eller nummer. Vi gjør det ved å se på feltet tokenizer.ttype.
Så vil vi lese det faktiske tokenet basert på denne typen:
- tokenizer.nval – hvis typen var et tall
- tokenizer.sval – hvis typen var en streng
I dette eksemplet vil vi bruke en annen inndatafil som ganske enkelt inneholder:
Følgende kode leser fra filen både strengen og tallet:
Legg merke til hvordan slutten på filtoken brukes på slutten.
Denne tilnærmingen er nyttig for å analysere en inngangsstrøm i tokens.
Lesing med DataInputStream
Vi kan bruke DataInputStream til å lese binær eller primitive datatyper fra en fil.
Følgende test leser filen ved hjelp av en DataInputStream:
Lesing med FileChannel
Hvis vi leser en stor fil, kan FileChannel være raskere enn standard IO.
Følgende kode leser databytes fra filen ved hjelp av FileChannel og RandomAccessFile:
Lese en UTF-8 Encod ed fil
La oss nå se hvordan du leser en UTF-8-kodet fil ved hjelp av BufferedReader. I dette eksemplet vil vi lese en fil som inneholder kinesiske tegn:
Lesing av innhold fra URL
For å lese innhold fra en URL, vil vi bruke «/» URL i vårt eksempel:
Det er også alternative måter å koble til en URL på. Her brukte vi URL- og URLConnection-klassen som er tilgjengelig i standard SDK.
Lesing av en fil fra en JAR
For å lese en fil som ligger inne i en JAR-fil, vi trenger en JAR med en fil i den. For eksempel vil vi lese «LICENSE.txt» fra filen «hamcrest-library-1.3.jar»:
Her vil vi laste inn LICENSE.txt som ligger i Hamcrest-biblioteket, så vi vil bruke Matcher-klassen som hjelper til med å skaffe en ressurs. Den samme filen kan lastes inn ved hjelp av klasselasteren også.
Konklusjon
Som vi kan se, det er mange muligheter for å laste en fil og lese data fra den ved hjelp av vanlig Java.
Vi kan laste en fil fra forskjellige steder som classpath, URL eller jar-filer.
Så vi kan bruke BufferedReader til å lese linje for linje, Skanner for å lese ved hjelp av forskjellige avgrensere, StreamTokenizer for å lese en fil i tokens, DataInputStream for å lese binære data og primitive datatyper, SequenceInput Stream for å koble flere filer til en strøm, FileChannel for å lese raskere fra stor filer osv.