Yleiskatsaus
Tässä opetusohjelmassa tutkitaan erilaisia tapoja lukea Java-tiedostosta .
Ensinnäkin opimme lataamaan tiedoston luokan polulta, URL-osoitteesta tai JAR-tiedostosta tavallisilla Java-luokilla.
Toiseksi näemme, kuinka lukea sisältöä BufferedReader, Scanner, StreamTokenizer, DataInputStream, SequenceInputStream ja FileChannel avulla. Keskustelemme myös UTF-8-koodatun tiedoston lukemisesta.
Lopuksi tutkitaan ladattavia uusia tekniikoita. ja lukea tiedosto Java 7: ssä ja Java 8: ssa.
Tämä artikkeli on osa Baeldungin ”Java – Takaisin perusasetuksiin” -sarjaa.
Lisätietoja:
Java – Luo tiedosto
Java – kirjoita tiedostoon
Asetukset
2.1 Syötetiedosto
Useimmissa tämän artikkelin esimerkeissä luemme tekstitiedoston, jonka tiedostonimi fileTest.txt sisältää yhden rivin:
Muutamia esimerkkejä varten käytämme eri tiedostoa; näissä tapauksissa mainitsemme tiedoston ja sen sisällön nimenomaisesti.
2.2 Helper Method
Käytämme joukkoa testiesimerkkejä ytimen kanssa Vain Java-luokat, ja testeissä käytämme väitteitä Hamcrest-hakijoiden kanssa.
Testit jakavat yhteisen readFromInputStream-menetelmän, joka muuntaa InputStreamin merkkijonoksi tulosten vahvistamisen helpottamiseksi:
Huomaa, että on olemassa muita tapoja saavuttaa sama tulos. Voimme lukea joitain vaihtoehtoja tästä artikkelista.
Tiedoston lukeminen luokkaradalta
3.1 . Tavallisen Java-sovelluksen käyttö
Tässä osassa kerrotaan, kuinka luetaan luokkatiedolla käytettävissä oleva tiedosto. Luemme ”tiedostoTest.txt”, joka on saatavana tiedostosta src / main / resources :
Edellä olevassa koodinpätkässä käytimme nykyistä luokkaa tiedoston lataamiseen getResourceAsStream-menetelmällä ja välitimme ladattavan tiedoston absoluuttisen polun.
Sama menetelmä on käytettävissä myös ClassLoader-ilmentymä:
Hankimme classLoa nykyisen luokan der käyttäen getClass (). getClassLoader ().
Tärkein ero on, että kun getResourceAsStreamia käytetään ClassLoader-ilmentymässä, polkua käsitellään absoluuttisena luokkapolun juuresta alkaen.
Kun sitä käytetään luokan ilmentymää vastaan, polku voi olla suhteessa pakettiin tai absoluuttinen polku, jonka vihjasi johtava kauttaviiva.
Huomaa tietysti, että käytännössä , avoimet virrat tulisi aina sulkea, kuten esimerkissämme oleva InputStream:
3.2. Commons-io-kirjaston käyttö
Toinen yleinen vaihtoehto on commons-io-paketin FileUtils-luokan käyttäminen:
Tässä välitämme File-objektin method readFileToString () FileUtils-luokassa. Tämä hyötyluokka onnistuu lataamaan sisällön tarvitsematta kirjoittaa kattilakoodia InputStream-ilmentymän luomiseksi ja tietojen lukemiseksi.
Sama kirjasto tarjoaa myös IOUtils-luokan:
Tässä me välittää FileInputStream-objekti IOUtils-luokan metodille toString (). Tämä apuohjelmaluokka toimii samalla tavalla kuin edellinen luodakseen InputStream-ilmentymän ja lukea tietoja.
Lukeminen BufferedReaderilla
Anna nyt ” Keskitymme eri tavoihin jäsentää tiedoston sisältöä.
Aloitamme yksinkertaisella tavalla lukea tiedostosta BufferedReader:
Huomaa, että readLine () palaa tyhjä, kun tiedoston loppu on saavutettu.
Lukeminen tiedostosta Java NIO: n avulla
JDK7: ssä NIO-paketti päivitettiin merkittävästi.
Katsotaanpa esimerkkiä Files-luokan ja readAllLines-menetelmän avulla. ReadAllLines-menetelmä hyväksyy polun.
Path-luokkaa voidaan pitää java.io.File-tiedoston päivityksenä, kun joitain lisätoimintoja on paikallaan.
5.1. Pienen tiedoston lukeminen
Seuraava koodi näyttää, kuinka pieni tiedosto luetaan uuden Files-luokan avulla:
Huomaa, että voimme käyttää readAllBytes () menetelmä, jos tarvitsemme binaaritietoja.
5.2. Suuren tiedoston lukeminen
Jos haluamme lukea suuren tiedoston Tiedostot-luokan kanssa, voimme käyttää BufferedReaderia.
Seuraava koodi lukee tiedoston käyttämällä uusi Files-luokka ja BufferedReader:
5.3. Tiedoston lukeminen käyttämällä Files.lines ()
JDK8 tarjoaa Linjat () -menetelmän Files-luokassa. Se palauttaa Stream of String -elementit.
Tarkastellaan esimerkkiä siitä, miten tiedot voidaan lukea tavuina ja purkaa ne käyttämällä UTF-8-merkistöä.
Seuraava koodi lukee tiedoston käyttämällä uusi Files.lines ():
Streamin käyttäminen IO-kanavien, kuten tiedostotoimintojen kanssa, meidän on suljettava virta nimenomaisesti käyttämällä close () -menetelmää.
Kuten näemme, Files-sovellusliittymä tarjoaa toisen helpon tavan lukea tiedoston sisältö merkkijonoksi.
Seuraavissa osioissa tarkastelemme muita harvinaisempia tapoja sellaisen tiedoston lukeminen, joka voi olla tarkoituksenmukaista joissakin tilanteissa.
Lukeminen skannerilla
Seuraavaksi käytetään skanneria lukemaan tiedostosta. Tässä käytämme välilyöntiä erottimena:
Huomaa, että oletuserotin on välilyönti, mutta skannerin kanssa voidaan käyttää useita erottimia.
Skanneri-luokka on hyödyllinen luettaessa sisältö konsolista tai kun sisältö sisältää alkeellisia arvoja, tunnetulla erottimella (esim. luettelo välilyönnillä erotetuista kokonaislukuista).
Lukeminen StreamTokenizerilla
Luketaan nyt tekstitiedosto tunnuksiksi StreamTokenizerin avulla.
Tunnistin toimii selvittämällä ensin mikä seuraava merkki on merkkijono tai numero. Teemme sen katsomalla tokenizer.ttype-kenttää.
Sitten luemme todellisen tunnuksen tämän tyypin perusteella:
- tokenizer.nval – jos tyyppi oli numero
- tokenizer.sval – jos tyyppi oli merkkijono
Tässä esimerkissä käytämme eri syötetiedostoa, joka sisältää yksinkertaisesti:
Seuraava koodi lukee tiedostosta sekä merkkijonon että numeron:
Huomaa, kuinka tiedoston tunnuksen loppua käytetään lopussa.
Tästä lähestymistavasta on hyötyä syötevirran jäsentämisessä tunnuksiksi.
Lukeminen DataInputStreamilla
Voimme käyttää DataInputStreamia binaaristen tai primitiiviset tietotyypit tiedostosta.
Seuraava testi lukee tiedoston DataInputStreamin avulla:
Lukeminen FileChannelilla
Jos luet suurta tiedostoa, FileChannel voi olla nopeampi kuin tavallinen IO.
Seuraava koodi lukee datatavut tiedostosta FileChannel- ja RandomAccessFile-tiedostoilla:
UTF-8-koodauksen lukeminen muokattu tiedosto
Katsotaan nyt, kuinka luetaan UTF-8-koodattu tiedosto BufferedReaderin avulla. Tässä esimerkissä luemme tiedoston, joka sisältää kiinalaisia merkkejä:
Sisällön lukeminen URL-osoitteesta
Sisällön lukemiseen URL-osoitteesta käytämme ”/” URL esimerkissämme:
On olemassa myös vaihtoehtoisia tapoja muodostaa yhteys URL-osoitteeseen. Tässä käytimme URL-osoitetta ja URLConnection-luokkaa, joka on saatavana tavallisessa SDK: ssa.
Tiedoston lukeminen JAR: sta
Voit lukea tiedoston, joka sijaitsee JAR-tiedosto, tarvitsemme JAR-tiedoston, jonka sisällä on tiedosto. Esimerkissä luemme ”LICENSE.txt” -tiedostosta ”hamcrest-library-1.3.jar”:
Täältä haluamme ladata LICENSE.txt-tiedoston, joka sijaitsee Hamcrest-kirjastossa, joten käytämme Matcher-luokka, joka auttaa saamaan resurssin. Sama tiedosto voidaan ladata myös classloaderilla.
Päätelmä
Kuten näemme, Tiedoston lataamiseen ja tietojen lukemiseen tavallisella Java-ohjelmalla on monia mahdollisuuksia.
Voimme ladata tiedoston eri sijainneista, kuten classpath-, URL- tai jar-tiedostoista.
Sitten voi käyttää BufferedReaderia lukemaan rivi riviltä, Skanneri lukemaan eri erottimilla, StreamTokenizer lukemaan tiedoston tunnuksiksi, DataInputStream lukemaan binääritietoja ja primitiivisiä tietotyyppejä, SequenceInput Stream linkittämään useita tiedostoja yhteen streamiin, FileChannel lukemaan nopeammin suurista tiedostot jne.