1. InputStreamReaderklasse

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:

InputStreamReader-klassen

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

Vi kjenner allerede en klasse som heter FileReader— det er en Readersom leser data fra en fil. Og hvor InputStreamReaderfår dataene fra? Det stemmer - fra en InputStream.

Når du oppretter et InputStreamReaderobjekt, må du sende inn et InputStreamobjekt eller en av dets etterkommerklasser. Eksempel:

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

Klassen InputStreamReaderhar alle metodene som Readerklassen har, og de fungerer på nøyaktig samme måte.

Hovedforskjellen mellom InputStreamReaderklassen og for eksempel FileReaderhvor de leser data fra. FileReaderleser data fra en fil (duh — det er derfor den heter FileReader), men InputStreamReaderleser data fra en InputStream.

Når du leser et tegn fra et FileReaderobjekt 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 InputStreamReaderobjekt ved hjelp av read()metoden, leser det i sin tur to byte fra FileInputStreamobjektet som sendes til det, som igjen leser data fra filen. Resultatet er en kjede av oppfordringer til read()metoder.


2. BufferedReaderklasse

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

Hva er poenget? I motsetning til konverterer ikke InputStreamReaderklassen BufferedReaderbyte til tegn: den konverterer ikke noe i det hele tatt. I stedet bufres data .

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

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);
   }
}
Lag et FileReaderobjekt. Datakilden er en fil.
Lag et BufferedReaderobjekt. Datakilden er en FileReader.
Så lenge det fortsatt er data i leseren
Les en linje
Vis linjen
Et viktig poeng:

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: Scannerklassen 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
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();

Vår venn er ikke annet enn en statisk variabel i klassen. Det er en hvis navn er .System.ininSystemInputStreamin

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.