Översikt
I denna handledning kommer vi att utforska olika sätt att läsa från en fil i Java .
Först lär vi oss hur man laddar en fil från klassvägen, en URL eller från en JAR-fil med hjälp av vanliga Java-klasser.
För det andra ser vi hur för att läsa innehållet med BufferedReader, Scanner, StreamTokenizer, DataInputStream, SequenceInputStream och FileChannel. Vi kommer också att diskutera hur man läser en UTF-8-kodad fil.
Slutligen kommer vi att utforska de nya teknikerna för att ladda och läs en fil i Java 7 och Java 8.
Denna artikel är en del av ”Java – Back to Basic” -serien om Baeldung.
Ytterligare läsning:
Java – Skapa en fil
Java – Skriv till fil
Inställning
2.1 Inmatningsfil
I de flesta exempel i hela den här artikeln läser vi en textfil med filnamn fileTest.txt som innehåller en rad:
För några exempel använder vi en annan fil; i dessa fall nämner vi filen och dess innehåll uttryckligen.
2.2 Hjälpmetod
Vi kommer att använda en uppsättning testexempel med kärna Endast Java-klasser och i testerna kommer vi att använda påståenden med Hamcrest-matchare.
Testerna delar en gemensam readFromInputStream-metod som förvandlar en InputStream till String för att underlätta resultat:
Observera att det finns andra sätt att uppnå samma resultat. Vi kan läsa den här artikeln för några alternativ.
Läsa en fil från Classpath
3.1 . Använda standard Java
Detta avsnitt förklarar hur man läser en fil som är tillgänglig på en klassstig. Vi läser ”fileTest.txt” som finns tillgänglig under src / main / resources :
I kodavsnittet ovan använde vi den aktuella klassen för att ladda en fil med getResourceAsStream-metoden och skickade den absoluta sökvägen för filen att ladda.
Samma metod finns tillgänglig på en ClassLoader-instans också:
Vi får classLoa der för den aktuella klassen med hjälp av getClass (). getClassLoader ().
Huvudskillnaden är att när du använder getResourceAsStream på en ClassLoader-instans, behandlas sökvägen som absolut från början av klassvägen.
När den används mot en klassinstans kan sökvägen vara relativt paketet, eller en absolut sökväg, vilket antyds av det ledande snedstrecket.
Observera naturligtvis att i praktiken , öppna strömmar bör alltid vara stängda, till exempel InputStream i vårt exempel:
3.2. Använda commons-io-biblioteket
Ett annat vanligt alternativ är att använda FileUtils-klassen i commons-io-paketet:
Här skickar vi filobjektet till metod readFileToString () i FileUtils-klassen. Den här verktygsklassen lyckas ladda innehållet utan att behöva skriva någon pannkod för att skapa en InputStream-instans och läsa data.
Samma bibliotek erbjuder också IOUtils-klassen:
Här skicka FileInputStream-objektet till metoden toString () i IOUtils-klassen. Den här verktygsklassen fungerar på samma sätt som den tidigare för att skapa en InputStream-instans och läsa data.
Läsning med BufferedReader
Låt nu ” s fokus på olika sätt att analysera innehållet i en fil.
Vi börjar med ett enkelt sätt att läsa från en fil med BufferedReader:
Observera att readLine () kommer att återvända null när filens slut når.
Läsning från en fil med Java NIO
I JDK7 uppdaterades NIO-paketet markant.
Låt oss titta på ett exempel med filklassen och metoden readAllLines. ReadAllLines-metoden accepterar en sökväg.
Sökvägsklass kan betraktas som en uppgradering av java.io-filen med några ytterligare åtgärder på plats.
5.1. Läsa en liten fil
Följande kod visar hur man läser en liten fil med den nya filklassen:
Observera att vi kan använda readAllBytes () metoden också om vi behöver binära data.
5.2. Läsa en stor fil
Om vi vill läsa en stor fil med Files-klassen kan vi använda BufferedReader.
Följande kod läser filen med den nya filklassen och BufferedReader:
5.3. Att läsa en fil med Files.lines ()
JDK8 erbjuder raderna () -metoden i Files-klassen. Den returnerar en ström av strängelement.
Låt oss titta på ett exempel på hur man läser data i byte och avkodar den med hjälp av UTF-8-teckenuppsättning.
Följande kod läser filen med de nya Files.lines ():
Med hjälp av Stream med IO-kanaler som filåtgärder måste vi stänga strömmen uttryckligen med hjälp av metoden close ().
Som vi kan se erbjuder Files API ett annat enkelt sätt att läsa in filinnehållet i en sträng.
I nästa avsnitt kommer vi att titta på andra mindre vanliga metoder för läsa en fil som kan vara lämplig i vissa situationer.
Läsning med skanner
Låt oss sedan använda en skanner för att läsa från filen. Här kommer vi att använda mellanslag som avgränsare:
Observera att standardavgränsaren är det vita utrymmet, men flera avgränsare kan användas med en skanner.
Skannerklassen är användbar vid läsning innehåll från konsolen, eller när innehållet innehåller primitiva värden, med en känd avgränsare (t.ex. en lista över heltal åtskilda av mellanslag).
Läsning med StreamTokenizer
Låt oss nu läsa en textfil i tokens med hjälp av en StreamTokenizer.
Tokenizer fungerar genom att först ta reda på vad nästa token är, sträng eller nummer. Vi gör det genom att titta på tokenizer.ttype-fältet.
Sedan läser vi den faktiska token baserat på den här typen:
- tokenizer.nval – om typen var ett nummer
- tokenizer.sval – om typen var en sträng
I det här exemplet använder vi en annan inmatningsfil som helt enkelt innehåller:
Följande kod läser från filen både strängen och numret:
Observera hur slutet på filtoken används i slutet.
Detta tillvägagångssätt är användbart för att analysera en inmatningsström i tokens.
Läsning med DataInputStream
Vi kan använda DataInputStream för att läsa binär eller primitiva datatyper från en fil.
Följande test läser filen med en DataInputStream:
Läser med FileChannel
Om vi läser en stor fil kan FileChannel vara snabbare än standard IO.
Följande kod läser databytes från filen med FileChannel och RandomAccessFile:
Läser en UTF-8-kod ed File
Låt oss nu se hur man läser en UTF-8-kodad fil med BufferedReader. I det här exemplet läser vi en fil som innehåller kinesiska tecken:
Läser innehåll från URL
För att läsa innehåll från en URL, använder vi ”/” URL i vårt exempel:
Det finns också alternativa sätt att ansluta till en URL. Här använde vi webbadressen och URLConnection-klassen som finns tillgänglig i standard-SDK.
Läsa en fil från en JAR
Att läsa en fil som finns i en JAR-fil, vi behöver en JAR med en fil inuti den. För vårt exempel kommer vi att läsa ”LICENSE.txt” från filen ”hamcrest-library-1.3.jar”:
Här vill vi ladda LICENSE.txt som finns i Hamcrest-biblioteket, så vi använder Matchers klass som hjälper till att skaffa en resurs. Samma fil kan laddas med klassläsaren också.
Slutsats
Som vi kan se, det finns många möjligheter att ladda en fil och läsa data från den med vanlig Java.
Vi kan ladda en fil från olika platser som klassstig, URL eller jar-filer.
Sedan kan använda BufferedReader för att läsa rad för rad, Scanner för att läsa med olika avgränsare, StreamTokenizer för att läsa en fil i tokens, DataInputStream för att läsa binära data och primitiva datatyper, SequenceInput Stream för att länka flera filer till en ström, FileChannel för att läsa snabbare från stora filer osv.