1. InputStreamReader
klasse
Et andet interessant træk ved streams er, at du kan kombinere flere streams sammen til kæder . En strøm kan læse data ikke kun fra dens interne datakilde, men også fra en anden strøm .
Dette er en meget kraftfuld mekanisme i Java, som gør det muligt at skabe komplekse datalæsningsscenarier ved at forbinde en strøm til en anden. Sådan en ordning ser sådan ud:
Når et program læser data fra en datastrøm, læser datastrømmen igen dataene fra sin datakilde, som for eksempel er en anden datastrøm eller en fil.
Desuden læser hver datastrøm ikke kun ind og uddeler data, men kan også transformere den eller udføre forskellige operationer på den. Et godt eksempel på sådan en "mellemstrøm" er InputStreamReader
klassen.
Vi kender allerede en klasse kaldet FileReader
— det er en Reader
, der læser data fra en fil. Og hvor InputStreamReader
får dens data fra? Det er rigtigt - fra en InputStream
.
Når du opretter et InputStreamReader
objekt, skal du sende et InputStream
objekt eller en af dets efterkommerklasser ind. Eksempel:
String src = "c:\\projects\\log.txt";
FileInputStream input = new FileInputStream(src);
InputStreamReader reader = new InputStreamReader(input);
Klassen InputStreamReader
har alle de metoder, som Reader
klassen har, og de fungerer på nøjagtig samme måde.
Den største forskel mellem InputStreamReader
klassen og f.eks. FileReader
hvor de læser data fra. FileReader
læser data fra en fil (duh — det er derfor den hedder FileReader
), men InputStreamReader
læser data fra en InputStream
.
Når du læser et tegn fra et FileReader
objekt ved hjælp af read()
metoden, læser det igen to bytes fra filen på disken og returnerer dem som chars
.
Når du læser et tegn fra et InputStreamReader
objekt ved hjælp af read()
metoden, læser det igen to bytes fra FileInputStream
objektet, der er sendt til det, som igen læser data fra filen. Resultatet er en kæde af kald til read()
metoder.
2. BufferedReader
klasse
En anden interessant klasse, som du sandsynligvis vil bruge meget, er BufferedReader
. Dette er også en "mellemstrøm", der læser data fra en anden strøm.
Som navnet antyder, BufferedReader
er klassen en underklasse af Reader
og lader dig læse tegn . Men det mest interessante er, at du også skal give den en datakilde i form af en strøm, hvorfra der kan læses tegn , altså en strøm, der arver Reader
klassen.
Hvad er pointen? I modsætning til konverterer InputStreamReader
klassen BufferedReader
ikke bytes til tegn: den konverterer slet ikke noget. I stedet bufres data .
Når et program læser et enkelt tegn fra et BufferedReader
objekt, læser objektet et stort udvalg af tegn fra sin kildestrøm på én gang. Og opbevarer dem internt.
Når det næste tegn læses fra objektet BufferedReader
, griber det blot det næste tegn fra dets interne bufferarray og returnerer det uden at få adgang til datakilden. Først når alle tegnene i bufferen er brugt op, læses den i endnu en stor række af tegn.
Klassen BufferedReader
har også en meget nyttig metode — String readLine()
, som lader dig læse hele datastrenge fra kildestrømmen på én gang. Du kan bruge denne metode til f.eks. at læse en fil og vise dens indhold på skærmen linje for linje. Eksempel:
Vi skrev specifikt noget kompakt kode for at illustrere, hvor praktisk dette kan være. Denne kode kunne også skrives med lidt flere detaljer.
|
Opret et FileReader objekt. Datakilden er en fil. Opret et BufferedReader objekt. Datakilden er en FileReader . Så længe der stadig er data i læseren Læs en linje Vis linjen |
Hvis du kæder flere strømme sammen, close()
skal metoden kun kaldes på én af dem. Denne strøm kalder metoden på dens datakilde og så videre, indtil close()
den kaldes på den endelige datastrøm.
3. Læsning fra konsollen
Og en mere interessant kendsgerning: Scanner
klassen er intet andet end en mellemliggende inputstrøm, der læser data fra System.in
, som også er en datastrøm.
Her er to måder at læse en linje fra konsollen på:
Scanner klasse | Klasser BufferedReader og BufferedWriter |
---|---|
|
|
Vores ven er ikke andet end en statisk variabel i klassen. Det er en hvis navn er .System.in
in
System
InputStream
in
Så næsten lige fra begyndelsen af dine Java-studier på CodeGym har du arbejdet med datastrømme og bygget kæder ud fra dem. Men nu vil du gøre det mere bevidst.
GO TO FULL VERSION