"Hallo, Amigo! Vandaag heeft Ellie je verteld over het adapterpatroon."

De meeste klassen met betrekking tot I/O-streams worden geïmplementeerd als adapters. Ze converteren equivalente interfaces of ze verbinden ze, beginnend bij de eenvoudige en gaandeweg naar de complexe.

"Zijn InputStreamReader en BufferedReader ook adapters? Op zijn minst lijken ze erg op adapters in de manier waarop ze worden gebruikt: nadat een object is gemaakt, wordt het doorgegeven aan de constructor van een andere klasse."

"Ja, InputStreamReader converteert de InputStream- interface naar de Reader- interface. BufferedReader is geen adapter in zijn puurste vorm, omdat de makers van Java besloten om zijn methoden niet hun eigen aparte interface te geven. Maar het is geestverwant."

In plaats van een biljoen verschillende klassen te schrijven, schreven de makers van Java twee dozijn adapters en lieten ze verbinding met elkaar maken zoals een programmeur dat zou willen.

Deze aanpak is erg handig. Een programmeur kan altijd haar klasse en/of adapter schrijven, deze een standaardinterface laten implementeren en opnemen in de keten van adapterobjecten die ze aan het bouwen is.

"Dus zo werkt het allemaal. In plaats van grote complexe klassen maken we ketens van eenvoudige objecten en adapters. En dan maak je ze gewoon en combineer je ze in de juiste volgorde!"

"En je implementeert wat ontbreekt."

"Ja ik snap het."

"Maar eigenlijk wilde ik je vandaag vertellen over Reader en Writer . Dit zijn twee abstracte klassen die erg lijken op de klassen InputStream en OutputStream. Maar in tegenstelling tot die klassen werken deze twee klassen met karakters. Ze lezen en schrijven karakters. erg handig bij het werken met tekstuele informatie. Laten we eens kijken naar de methoden die ze hebben:"

Reader-methoden Wat de methode doet
int read(char[] cbuf);
"Deze methode leest onmiddellijk verschillende karakters in de buffer ( char array ), totdat de buffer vol is of totdat de bron geen karakters meer heeft om te lezen."
De methode retourneert het aantal daadwerkelijk gelezen tekens (dit kan kleiner zijn dan de lengte van de array)
int read();
"Deze methode leest één teken en retourneert het. Het resultaat wordt verbreed tot een int voor uiterlijk. Als er geen beschikbare tekens zijn, retourneert de methode -1."
boolean ready();
Deze methode retourneert true als er ongelezen tekens zijn voor de leesmethoden
void close();
Deze methode «sluit» de stream. Je roept dit aan als je klaar bent met werken met de stream.
Het object voert vervolgens de huishoudelijke bewerkingen uit die nodig zijn om het bestand te sluiten, enz
. Op dit moment kunt u geen gegevens meer uit de stream lezen.

"Het blijkt dat de read(char [] cbuf) -methode van Reader ons in staat stelt hele blokken tekens te lezen in plaats van één teken tegelijk. Het is dus sneller en handiger."

"Precies. En laten we nu eens kijken welke methoden Writer heeft:"

Methode Wat de methode doet
void write(int c);
Deze methode schrijft één teken. Het int type is versmald tot een char. Het extra deel wordt gewoon weggegooid.
void write(char[] cbuff);
Deze methode schrijft een reeks tekens.
void write(String s);
Deze methode schrijft een string. Het wordt eenvoudig geconverteerd naar een reeks tekens en vervolgens wordt de tweede methode aangeroepen.
void flush();
Als de stream intern gegevens opslaat die nog niet zijn geschreven, dwingt deze methode het schrijven af.
void close();
Deze methode «sluit» de stream. Je roept dit aan als je klaar bent met werken met de stream.
Het object voert vervolgens de huishoudelijke bewerkingen uit die nodig zijn om het bestand te sluiten, enz. U kunt geen gegevens meer naar de stream schrijven en flush wordt automatisch aangeroepen.

Het is belangrijk om te begrijpen dat Reader en Writer abstracte klassen zijn. Ze doen niets en bevatten vrijwel geen code. Al hun methoden moeten worden geïmplementeerd in de klassen die ze overerven. Het is hun taak om te standaardiseren hoe klassen met elkaar omgaan . Ontwikkelaars hoeven hun eigen standaarden niet uit te vinden om met elkaar te communiceren. Het is voor iedereen veel handiger om een ​​paar basisnormen aan te houden. Hierdoor kunnen klassen die door verschillende programmeurs zijn geschreven gemakkelijk interageren, niet alleen met klassen die door de makers van Java zijn geschreven, maar ook met klassen die door andere programmeurs zijn geschreven.

Normen zijn krachtig.

"Ik ben het ermee eens. Het ondersteunen van gemeenschappelijke normen komt iedereen ten goede."