Oversigt
I denne vejledning udforsker vi forskellige måder at læse fra en fil i Java .
Først lærer vi, hvordan man indlæser en fil fra klassestien, en URL eller fra en JAR-fil ved hjælp af standard Java-klasser.
For det andet vil vi se hvordan at læse indholdet med BufferedReader, Scanner, StreamTokenizer, DataInputStream, SequenceInputStream og FileChannel. Vi vil også diskutere, hvordan man læser en UTF-8-kodet fil.
Endelig vil vi undersøge de nye teknikker, der skal indlæses og læs en fil i Java 7 og Java 8.
Denne artikel er en del af “Java – Back to Basic” -serien om Baeldung.
Yderligere læsning:
Java – Opret en fil
Java – Skriv til fil
Opsætning
2.1 Inputfil
I de fleste eksempler i hele denne artikel læser vi en tekstfil med filnavn fileTest.txt, der indeholder en linje:
For et par eksempler bruger vi en anden fil; i disse tilfælde nævner vi filen og dens indhold eksplicit.
2.2 Hjælpemetode
Vi bruger et sæt testeksempler med kerne Kun Java-klasser, og i testene bruger vi påstande med Hamcrest-matchere.
Test deler en fælles readFromInputStream-metode, der omdanner en InputStream til String for lettere at hævde resultater:
Bemærk, at der er andre måder at opnå det samme resultat på. Vi kan se denne artikel for nogle alternativer.
Læsning af en fil fra Classpath
3.1 Brug af Standard Java
Dette afsnit forklarer, hvordan man læser en fil, der er tilgængelig på en klassesti. Vi læser “fileTest.txt”, der er tilgængelig under src / main / resources :
I ovenstående kodestykke brugte vi den aktuelle klasse til at indlæse en fil ved hjælp af getResourceAsStream-metoden og passerede den absolutte sti til filen, der skal indlæses.
Den samme metode er tilgængelig på også en ClassLoader-forekomst:
Vi opnår classLoa der af den aktuelle klasse ved hjælp af getClass (). getClassLoader ().
Hovedforskellen er, at når man bruger getResourceAsStream på en ClassLoader-instans, behandles stien som absolut startende fra rodstien til klassestien.
Når den bruges mod en klasseinstans, kan stien være i forhold til pakken eller en absolut sti, hvilket er antydet af den førende skråstreg.
Bemærk selvfølgelig, at i praksis , skal åbne streams altid være lukket, såsom InputStream i vores eksempel:
3.2. Brug af commons-io Library
En anden almindelig mulighed er at bruge FileUtils-klassen i commons-io-pakken:
Her videresender vi filobjektet til metode readFileToString () i FileUtils-klassen. Denne hjælpeklasse formår at indlæse indholdet uden behovet for at skrive nogen kedelpladekode for at oprette en InputStream-forekomst og læse data.
Det samme bibliotek tilbyder også IOUtils-klassen:
Her vi videregive FileInputStream-objektet til metoden toString () i IOUtils-klassen. Denne hjælpeklasse fungerer på samme måde som den forrige for at oprette en InputStream-forekomst og læse data.
Læsning med BufferedReader
Lad os nu ” s fokus på forskellige måder at analysere indholdet af en fil på.
Vi starter med en enkel måde at læse fra en fil ved hjælp af BufferedReader:
Bemærk, at readLine () vender tilbage null når slutningen af filen er nået.
Læsning fra en fil ved hjælp af Java NIO
I JDK7 blev NIO-pakken opdateret betydeligt.
Lad os se på et eksempel ved hjælp af klassen Files og metoden readAllLines. ReadAllLines-metoden accepterer en sti.
Stoklasse kan betragtes som en opgradering af java.io-filen med nogle yderligere operationer på plads.
5.1. Læsning af en lille fil
Følgende kode viser, hvordan man læser en lille fil ved hjælp af den nye Files-klasse:
Bemærk, at vi kan bruge readAllBytes () metode også, hvis vi har brug for binære data.
5.2. Læsning af en stor fil
Hvis vi vil læse en stor fil med Files-klassen, kan vi bruge BufferedReader.
Den følgende kode læser filen ved hjælp af den nye filklasse og BufferedReader:
5.3. Læsning af en fil ved hjælp af Files.lines ()
JDK8 tilbyder metoden linjer () inden for Files-klassen. Det returnerer en strøm af strengelementer.
Lad os se på et eksempel på, hvordan man læser data i bytes og afkoder dem ved hjælp af UTF-8-tegnsæt.
Den følgende kode læser filen ved hjælp af de nye Files.lines ():
Ved hjælp af Stream med IO-kanaler som filoperationer er vi nødt til at lukke strømmen eksplicit ved hjælp af metoden close ().
Som vi kan se, tilbyder Files API en anden nem måde at læse filindholdet på i en streng.
I de næste sektioner vil vi se på andre mindre almindelige metoder til læsning af en fil, der kan være passende i nogle situationer.
Læsning med scanner
Lad os derefter bruge en scanner til at læse fra filen. Her skal vi bruge mellemrum som afgrænser:
Bemærk, at standardafgrænsningen er det hvide område, men flere afgrænsere kan bruges med en scanner.
Scannerklassen er nyttig, når du læser indhold fra konsollen, eller når indholdet indeholder primitive værdier, med en kendt afgrænser (f.eks. en liste over heltal adskilt af mellemrum).
Læsning med StreamTokenizer
Lad os nu læse en tekstfil i tokens ved hjælp af en StreamTokenizer.
Tokenizer fungerer ved først at finde ud af, hvad det næste token er, streng eller nummer. Det gør vi ved at se på feltet tokenizer.ttype.
Så læser vi det aktuelle token baseret på denne type:
- tokenizer.nval – hvis typen var et nummer
- tokenizer.sval – hvis typen var en streng
I dette eksempel bruger vi en anden inputfil, der simpelthen indeholder:
Følgende kode læser fra filen både strengen og nummeret:
Bemærk hvordan slutningen af filtoken bruges i slutningen.
Denne tilgang er nyttig til at analysere en inputstrøm i tokens.
Læsning med DataInputStream
Vi kan bruge DataInputStream til at læse binært eller primitive datatyper fra en fil.
Følgende test læser filen ved hjælp af en DataInputStream:
Læsning med FileChannel
Hvis vi læser en stor fil, kan FileChannel være hurtigere end standard IO.
Følgende kode læser databytes fra filen ved hjælp af FileChannel og RandomAccessFile:
Læsning af en UTF-8-kodning ed fil
Lad os nu se, hvordan man læser en UTF-8-kodet fil ved hjælp af BufferedReader. I dette eksempel læser vi en fil, der indeholder kinesiske tegn:
Læsning af indhold fra URL
For at læse indhold fra en URL, bruger vi “/” URL i vores eksempel:
Der er også alternative måder at oprette forbindelse til en URL på. Her brugte vi URL’en og URLConnection-klassen, der er tilgængelig i standard SDK.
Læsning af en fil fra en JAR
For at læse en fil, der er placeret inde i en JAR-fil, vi har brug for en JAR med en fil inde i den. For vores eksempel læser vi “LICENSE.txt” fra filen “hamcrest-library-1.3.jar”:
Her vil vi indlæse LICENSE.txt, der findes i Hamcrest-biblioteket, så vi bruger Matchers klasse, der hjælper med at få en ressource. Den samme fil kan også indlæses ved hjælp af classloader.
Konklusion
Som vi kan se, der er mange muligheder for at indlæse en fil og læse data fra den ved hjælp af almindelig Java.
Vi kan indlæse en fil fra forskellige placeringer som classpath, URL eller jar-filer.
Så vi kan bruge BufferedReader til at læse linje for linje, Scanner til at læse ved hjælp af forskellige afgrænsere, StreamTokenizer til at læse en fil i tokens, DataInputStream til at læse binære data og primitive datatyper, SequenceInput Stream for at linke flere filer til en stream, FileChannel til at læse hurtigere fra store filer osv.