"Hei, Amigo! I dag skal vi bli kjent med input/output-strømmer . Vi valgte dette emnet for et par dager siden, men i dag skal vi utforske det grundig. Input/output-strømmer er delt inn i 4 kategorier:"

1) Strømmer er delt inn etter retning: inngangsstrømmer og utgangsstrømmer

2) Strømmer er delt inn etter deres datatype: de som jobber med byte og de som jobber med tegn .

Her er disse divisjonene representert i en tabell:

Inndatastrøm Utgangsstrøm
Fungerer med bytes InputStream OutputStream
Jobber med karakterer Leser Forfatter

Hvis et objekt implementerer InputStream- grensesnittet, støtter det muligheten til å lese bytes sekvensielt fra det.

Hvis et objekt implementerer OutputStream- grensesnittet, støtter det muligheten til å skrive byte sekvensielt til det.

Hvis et objekt implementerer Reader- grensesnittet, støtter det muligheten til å lese tegn (tegn) sekvensielt fra det.

Hvis et objekt implementerer Writer- grensesnittet, støtter det muligheten til å skrive tegn (tegn) sekvensielt til det.

Inn-/utdatastrømmer - 1

En utdatastrøm er som en skriver. Vi kan skrive ut dokumenter til skriveren. Vi kan sende ut data til en utdatastrøm.

På sin side kan en inngangsstrøm sammenlignes med en skanner, eller kanskje en stikkontakt. Med en skanner kan vi bringe dokumenter inn på datamaskinen vår. Eller vi kan koble til en stikkontakt og motta strøm fra den. Vi kan motta data fra en inngangsstrøm.

"Hvor brukes de?"

"Disse klassene brukes overalt i Java. Vår kjente venn System.in er en statisk InputStream- variabel navngitt i System - klassen."

"Seriøst?! Så hele denne tiden har jeg brukt en InputStream og skjønte det ikke engang. Er System.out også en strøm?"

"Ja, System.out er en statisk PrintStream (en etterkommer av OutputStream )-variabel i System-klassen."

"Du mener å fortelle meg at jeg alltid har brukt strømmer og ikke engang visste det?"

"Ja, og det forteller oss bare hvor praktiske disse strømmene er. Du bare ta en og bruk den."

"Men du kan ikke si det om System.in. Vi måtte hele tiden legge til BufferedReader eller InputStreamReader til den."

"Det er sant. Men det var også grunner til det."

Det finnes mange datatyper, og mange måter å jobbe med dem på. Så antallet standard I/O-klasser vokste veldig raskt, selv om de gjorde alt på nesten samme måte. For å unngå denne kompleksiteten brukte Java-utviklere abstraksjonsprinsippet og delte klasser inn i mange små deler.

Men du kan koble disse delene på en sammenhengende måte og få svært kompleks funksjonalitet, hvis du trenger det. Se på dette eksemplet:

Send ut en streng til konsollen
System.out.println("Hello");
Lagre konsollens utdatastrøm i en separat variabel.
Send ut en streng til strømmen.
PrintStream console = System.out;
console.println("Hello");
Lag en dynamisk (utvidende) byte-array i minnet.
Koble den til en ny utgangsstrøm (PrintStream-objekt).
Send ut en streng til strømmen.
ByteArrayOutputStream stream = new ByteArrayOutputStream();
PrintStream console = new PrintStream(stream);
console.println("Hello");

"Ærlig talt, dette er som et Lego-sett. Bare det er ikke klart for meg hva noen av denne koden gjør."

"Ikke bry deg om det foreløpig. Alt til sin tid."

Dette er hva jeg vil at du skal huske: Hvis en klasse implementerer OutputStream-grensesnittet, kan du skrive byte til den. Nesten akkurat som du sender ut data til konsollen. Hva den gjør med den er dens sak. Med vårt "Lego-sett" bryr vi oss ikke om formålet med hver enkelt del. Vi bryr oss om at det store utvalget av deler lar oss bygge så kule ting.

"Ok. Hvor skal vi begynne?"