"Ciao, Amigo! Oggi, Ellie ti ha parlato dello schema dell'adattatore."

La maggior parte delle classi relative ai flussi di I/O sono implementate come adattatori. O convertono interfacce equivalenti o le collegano, partendo dal semplice e passando al complesso.

" InputStreamReader e BufferedReader sono anche adattatori? Per lo meno, sono molto simili agli adattatori nel modo in cui vengono utilizzati: dopo che un oggetto è stato creato, viene passato al costruttore di un'altra classe."

"Sì, InputStreamReader converte l' interfaccia InputStream nell'interfaccia Reader . BufferedReader non è un adattatore nella sua forma più pura, perché i creatori di Java hanno deciso di non dare ai suoi metodi la propria interfaccia separata. Ma è uno spirito affine."

Invece di scrivere un miliardo di classi diverse, i creatori di Java hanno scritto due dozzine di adattatori e hanno permesso loro di connettersi tra loro come un programmatore potrebbe desiderare.

Questo approccio è molto conveniente. Un programmatore può sempre scrivere la sua classe e/o adattatore, fare in modo che implementi un'interfaccia standard e includerla nella catena di oggetti adattatore che sta costruendo.

"Quindi è così che funziona. Invece di grandi classi complesse, creiamo catene di oggetti e adattatori semplici. E poi basta crearli e combinarli nell'ordine giusto!"

"E implementi tutto ciò che manca."

"Sì capisco."

"Ma in realtà oggi volevo parlarvi di Reader e Writer . Queste sono due classi astratte molto simili alle classi InputStream e OutputStream. Ma a differenza di quelle classi, queste due classi lavorano con i caratteri. Leggono e scrivono caratteri. Sono molto comodo quando si lavora con informazioni testuali. Diamo un'occhiata ai metodi che hanno:"

Metodi di lettura Cosa fa il metodo
int read(char[] cbuf);
"Questo metodo legge immediatamente diversi caratteri nel buffer ( char array ), finché il buffer non è pieno o finché la sorgente non ha più caratteri da leggere."
Il metodo restituisce il numero di caratteri effettivamente letti (che può essere inferiore alla lunghezza dell'array)
int read();
"Questo metodo legge un carattere e lo restituisce. Il risultato viene ampliato a un int per i look. Se non ci sono caratteri disponibili, il metodo restituisce -1."
boolean ready();
Questo metodo restituisce true se sono presenti caratteri non letti per i metodi read
void close();
Questo metodo «chiude» il flusso. Lo chiami quando hai finito di lavorare con lo stream.
L'oggetto quindi esegue le operazioni di pulizia necessarie per chiudere il file, ecc.
A questo punto, non è possibile leggere altri dati dallo stream.

"Si scopre che il metodo read(char [] cbuf) di Reader ci consente di leggere interi blocchi di caratteri, piuttosto che un carattere alla volta. Quindi è più veloce e più conveniente."

"Esattamente. E ora vediamo quali metodi ha Writer:"

Metodo Cosa fa il metodo
void write(int c);
Questo metodo scrive un carattere. Il tipo int è ristretto a un carattere. La parte extra viene semplicemente scartata.
void write(char[] cbuff);
Questo metodo scrive una matrice di caratteri.
void write(String s);
Questo metodo scrive una stringa. Viene semplicemente convertito in un array di caratteri e quindi viene chiamato il secondo metodo.
void flush();
Se il flusso memorizza internamente dati che non sono ancora stati scritti, questo metodo ne forza la scrittura.
void close();
Questo metodo «chiude» il flusso. Lo chiami quando hai finito di lavorare con lo stream.
L'oggetto quindi esegue le operazioni di pulizia necessarie per chiudere il file, ecc. Non è più possibile scrivere dati nel flusso e flush viene chiamato automaticamente.

È importante capire che Reader e Writer sono classi astratte. Non fanno nulla e non contengono praticamente alcun codice. Tutti i loro metodi dovranno essere implementati nelle classi che li ereditano. Il loro compito è quello di standardizzare il modo in cui le classi interagiscono . Gli sviluppatori non hanno bisogno di inventare i propri standard per interagire tra loro. È molto più conveniente per tutti mantenere alcuni standard di base. Ciò consente alle classi scritte da diversi programmatori di interagire facilmente non solo con le classi scritte dai creatori di Java, ma anche con le classi scritte da altri programmatori.

Gli standard sono potenti.

"Sono d'accordo. Sostenere standard comuni è vantaggioso per tutti."