1. InputStreamReader
klasse
En annen interessant funksjon ved strømmer er at du kan kombinere flere strømmer sammen til kjeder . En strøm kan lese data ikke bare fra sin interne datakilde, men også fra en annen strøm .
Dette er en veldig kraftig mekanisme i Java, som gjør det mulig å lage komplekse datalesescenarier ved å koble en strøm til en annen. Et slikt opplegg ser slik ut:
Når et program leser data fra en datastrøm, leser datastrømmen i sin tur dataene fra sin datakilde, som for eksempel er en annen datastrøm eller en fil.
Dessuten leser hver datastrøm ikke bare inn og gir ut data, men kan også transformere den eller utføre ulike operasjoner på den. Et godt eksempel på en slik «mellomstrøm» er InputStreamReader
klassen.
Vi kjenner allerede en klasse som heter FileReader
— det er en Reader
som leser data fra en fil. Og hvor InputStreamReader
får dataene fra? Det stemmer - fra en InputStream
.
Når du oppretter et InputStreamReader
objekt, må du sende inn et InputStream
objekt eller en av dets etterkommerklasser. Eksempel:
String src = "c:\\projects\\log.txt";
FileInputStream input = new FileInputStream(src);
InputStreamReader reader = new InputStreamReader(input);
Klassen InputStreamReader
har alle metodene som Reader
klassen har, og de fungerer på nøyaktig samme måte.
Hovedforskjellen mellom InputStreamReader
klassen og for eksempel FileReader
hvor de leser data fra. FileReader
leser data fra en fil (duh — det er derfor den heter FileReader
), men InputStreamReader
leser data fra en InputStream
.
Når du leser et tegn fra et FileReader
objekt ved hjelp av read()
metoden, leser det igjen to byte fra filen på disken og returnerer dem som chars
.
Når du leser et tegn fra et InputStreamReader
objekt ved hjelp av read()
metoden, leser det i sin tur to byte fra FileInputStream
objektet som sendes til det, som igjen leser data fra filen. Resultatet er en kjede av oppfordringer til read()
metoder.
2. BufferedReader
klasse
En annen interessant klasse som du sannsynligvis kommer til å bruke mye er BufferedReader
. Dette er også en "mellomstrøm" som leser data fra en annen strøm.
Som navnet antyder, BufferedReader
er klassen en underklasse av Reader
og lar deg lese tegn . Men det som er mest interessant er at du også må gi den en datakilde i form av en strøm som tegn kan leses fra , altså en strøm som arver Reader
klassen.
Hva er poenget? I motsetning til konverterer ikke InputStreamReader
klassen BufferedReader
byte til tegn: den konverterer ikke noe i det hele tatt. I stedet bufres data .
Når et program leser et enkelt tegn fra et BufferedReader
objekt, leser objektet et stort utvalg tegn fra kildestrømmen på en gang. Og lagrer dem internt.
Når det neste tegnet leses fra objektet BufferedReader
, henter det ganske enkelt det neste tegnet fra dets interne bufferarray og returnerer det uten å få tilgang til datakilden. Bare når alle tegnene i bufferen er brukt opp, leses den inn i et annet stort utvalg av tegn.
Klassen BufferedReader
har også en veldig nyttig metode — String readLine()
, som lar deg lese hele datastrenger fra kildestrømmen på en gang. Du kan bruke denne metoden til å for eksempel lese en fil og vise innholdet på skjermen linje for linje. Eksempel:
Vi skrev spesielt litt kompakt kode for å illustrere hvor praktisk dette kan være. Denne koden kan også skrives med litt mer detaljer.
|
Lag et FileReader objekt. Datakilden er en fil. Lag et BufferedReader objekt. Datakilden er en FileReader . Så lenge det fortsatt er data i leseren Les en linje Vis linjen |
Hvis du lenker sammen flere strømmer, close()
trenger metoden bare å bli kalt på én av dem. Den strømmen vil kalle metoden på sin datakilde, og så videre, til close()
den kalles på den endelige datastrømmen.
3. Lesing fra konsollen
Og enda et interessant faktum: Scanner
klassen er ikke noe mer enn en mellominndatastrøm som leser data fra System.in
, som også er en datastrøm.
Her er to måter å lese en linje fra konsollen på:
Skanner klasse | Klassene BufferedReader og BufferedWriter |
---|---|
|
|
Vår venn er ikke annet enn en statisk variabel i klassen. Det er en hvis navn er .System.in
in
System
InputStream
in
Så nesten helt fra begynnelsen av Java-studiene dine på CodeGym, har du jobbet med datastrømmer og bygget kjeder fra dem. Men nå vil du gjøre det mer bevisst.
GO TO FULL VERSION