1. InputStreamReaderklasse

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:

InputStreamReader klasse

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 InputStreamReaderklassen.

Vi kender allerede en klasse kaldet FileReader— det er en Reader, der læser data fra en fil. Og hvor InputStreamReaderfår dens data fra? Det er rigtigt - fra en InputStream.

Når du opretter et InputStreamReaderobjekt, skal du sende et InputStreamobjekt eller en af ​​dets efterkommerklasser ind. Eksempel:

String src = "c:\\projects\\log.txt";
FileInputStream input = new FileInputStream(src);
InputStreamReader reader = new InputStreamReader(input);

Klassen InputStreamReaderhar alle de metoder, som Readerklassen har, og de fungerer på nøjagtig samme måde.

Den største forskel mellem InputStreamReaderklassen og f.eks. FileReaderhvor de læser data fra. FileReaderlæser data fra en fil (duh — det er derfor den hedder FileReader), men InputStreamReaderlæser data fra en InputStream.

Når du læser et tegn fra et FileReaderobjekt 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 InputStreamReaderobjekt ved hjælp af read()metoden, læser det igen to bytes fra FileInputStreamobjektet, der er sendt til det, som igen læser data fra filen. Resultatet er en kæde af kald til read()metoder.


2. BufferedReaderklasse

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, BufferedReaderer klassen en underklasse af Readerog 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 Readerklassen.

Hvad er pointen? I modsætning til konverterer InputStreamReaderklassen BufferedReaderikke bytes til tegn: den konverterer slet ikke noget. I stedet bufres data .

Når et program læser et enkelt tegn fra et BufferedReaderobjekt, 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 BufferedReaderhar 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.

String src = "c:\\projects\\log.txt";

try(FileReader in = new FileReader(src);
BufferedReader reader = new BufferedReader(in))
{
   while (reader.ready())
   {
      String line = reader.readLine();
      System.out.println(line);
   }
}
Opret et FileReaderobjekt. Datakilden er en fil.
Opret et BufferedReaderobjekt. Datakilden er en FileReader.
Så længe der stadig er data i læseren
Læs en linje
Vis linjen
En vigtig pointe:

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: Scannerklassen 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
InputStream stream = System.in;
Scanner console = new Scanner(stream);
String line = console.nextLine();
InputStream stream = System.in;
InputStreamReader reader = new InputStreamReader(stream);
BufferedReader buff = new BufferedReader(reader);
String line = buff.readLine();

Vores ven er ikke andet end en statisk variabel i klassen. Det er en hvis navn er .System.ininSystemInputStreamin

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.