"Hallo, Amigo! Vandaag maken we kennis met input/output streams . We hebben dit onderwerp een paar dagen geleden al uitgekozen, maar vandaag gaan we er uitgebreid op in. Input/output streams zijn onderverdeeld in 4 categorieën:"

1) Stromen worden verdeeld volgens hun richting: invoerstromen en uitvoerstromen

2) Streams zijn verdeeld volgens hun gegevenstype: streams die werken met bytes en streams die werken met tekens .

Hier worden deze divisies weergegeven in een tabel:

Invoerstroom Uitvoerstroom
Werkt met bytes InputStream Uitvoerstroom
Werkt met karakters Lezer auteur

Als een object de InputStream- interface implementeert , ondersteunt het de mogelijkheid om er sequentieel bytes uit te lezen.

Als een object de OutputStream- interface implementeert , ondersteunt het de mogelijkheid om er sequentieel bytes naar te schrijven.

Als een object de Reader- interface implementeert, ondersteunt het de mogelijkheid om er achtereenvolgens karakters (karakters) van te lezen.

Als een object de Writer- interface implementeert, ondersteunt het de mogelijkheid om er achtereenvolgens karakters (chars) naar te schrijven.

Input/Output-stromen - 1

Een uitvoerstroom is als een printer. We kunnen documenten uitvoeren naar de printer. We kunnen gegevens uitvoeren naar een uitvoerstroom.

Een invoerstroom van zijn kant kan worden vergeleken met een scanner, of misschien een stopcontact. Met een scanner kunnen we documenten op onze computer zetten. Of we kunnen de stekker in een stopcontact steken en er elektriciteit van ontvangen. We kunnen gegevens ontvangen van een invoerstroom.

"Waar worden ze gebruikt?"

"Deze klassen worden overal in Java gebruikt. Onze bekende vriend System.in is een statische InputStream- variabele die wordt genoemd in de klasse System ."

"Serieus?! Dus ik heb al die tijd een InputStream gebruikt en had het niet eens door. Is System.out ook een stream?"

"Ja, System.out is een statische PrintStream (een afstammeling van OutputStream ) variabele in de System klasse."

'Bedoel je me te vertellen dat ik altijd al streams heb gebruikt en dat ik het niet eens wist?'

"Ja, en dat vertelt ons gewoon hoe handig deze streams zijn. Je pakt er gewoon een en gebruikt hem."

"Maar dat kun je niet zeggen van System.in. We moesten er voortdurend BufferedReader of InputStreamReader aan toevoegen."

'Dat klopt. Maar daar waren ook redenen voor.'

Er zijn veel gegevenstypen en veel manieren om ermee te werken. Het aantal standaard I/O-klassen groeide dus heel snel, hoewel ze alles op bijna dezelfde manier deden. Om deze complexiteit te vermijden, gebruikten Java-ontwikkelaars het principe van abstractie en verdeelden klassen in vele kleine delen.

Maar je kunt deze onderdelen op een samenhangende manier met elkaar verbinden en zo een zeer complexe functionaliteit krijgen, als je die nodig hebt. Kijk naar dit voorbeeld:

Voer een tekenreeks uit naar de console
System.out.println("Hello");
Sla de console-uitvoerstroom op in een aparte variabele.
Voer een tekenreeks uit naar de stream.
PrintStream console = System.out;
console.println("Hello");
Maak een dynamische (uitbreidende) byte-array in het geheugen.
Verbind het met een nieuwe uitvoerstroom (PrintStream-object).
Voer een tekenreeks uit naar de stream.
ByteArrayOutputStream stream = new ByteArrayOutputStream();
PrintStream console = new PrintStream(stream);
console.println("Hello");

"Eerlijk gezegd is dit als een Lego-set. Alleen is het mij niet duidelijk wat deze code doet."

'Maak je daar voorlopig geen zorgen over. Alles op zijn tijd.'

Dit is wat ik wil dat je onthoudt: als een klasse de OutputStream-interface implementeert, kun je er bytes naar schrijven. Bijna precies zoals u gegevens naar de console uitvoert. Wat het ermee doet, is zijn zaak. Met onze "Lego-kit" geven we niet om het doel van elk afzonderlijk onderdeel. We vinden het belangrijk dat we met de grote keuze aan onderdelen zulke coole dingen kunnen bouwen.

"Oké. Waar beginnen we dan?"