"¡Hola, amigo! Hoy, Ellie te contó sobre el patrón del adaptador".

La mayoría de las clases relacionadas con flujos de E/S se implementan como adaptadores. O bien convierten interfaces equivalentes o las conectan, comenzando por lo simple y avanzando hacia lo complejo.

"¿ InputStreamReader y BufferedReader también son adaptadores? Como mínimo, son muy similares a los adaptadores en la forma en que se usan: después de crear un objeto, se pasa al constructor de otra clase".

"Sí, InputStreamReader convierte la interfaz InputStream en la interfaz Reader . BufferedReader no es un adaptador en su forma más pura, porque los creadores de Java decidieron no darle a sus métodos su propia interfaz separada. Pero es un espíritu afín".

En lugar de escribir miles de millones de clases diferentes, los creadores de Java escribieron dos docenas de adaptadores y les permitieron conectarse entre sí como quisiera un programador.

Este enfoque es muy conveniente. Un programador siempre puede escribir su clase y/o adaptador, hacer que implemente una interfaz estándar e incluirlo en la cadena de objetos de adaptador que está construyendo.

"Así es como funciona todo. En lugar de clases grandes y complejas, creamos cadenas de objetos simples y adaptadores. ¡Y luego los creas y los combinas en el orden correcto!"

"E implementas lo que falta".

"Si lo entendi."

"Pero en realidad quería hablarles sobre Reader y Writer hoy. Estas son dos clases abstractas que son muy similares a las clases InputStream y OutputStream. Pero a diferencia de esas clases, estas dos clases trabajan con caracteres. Leen y escriben caracteres. Son muy conveniente cuando se trabaja con información textual. Echemos un vistazo a los métodos que tienen:"

Métodos de lectura que hace el metodo
int read(char[] cbuf);
"Este método lee inmediatamente varios caracteres en el búfer ( matriz de caracteres ), hasta que el búfer está lleno o hasta que la fuente no tiene más caracteres para leer".
El método devuelve el número de caracteres realmente leídos (que puede ser menor que la longitud de la matriz)
int read();
"Este método lee un carácter y lo devuelve. El resultado se amplía a un int para buscar. Si no hay caracteres disponibles, el método devuelve -1".
boolean ready();
Este método devuelve verdadero si hay caracteres no leídos para los métodos de lectura.
void close();
Este método «cierra» el flujo. Llamas a esto cuando hayas terminado de trabajar con la transmisión.
Luego, el objeto realiza las operaciones de limpieza necesarias para cerrar el archivo, etc.
En este punto, no puede leer más datos de la secuencia.

"Resulta que el método read(char [] cbuf) de Reader nos permite leer bloques completos de caracteres, en lugar de un carácter a la vez. Por lo tanto, es más rápido y conveniente".

"Exactamente. Y ahora veamos qué métodos tiene Writer:"

Método que hace el metodo
void write(int c);
Este método escribe un carácter. El tipo int se reduce a un char. La parte extra simplemente se descarta.
void write(char[] cbuff);
Este método escribe una matriz de caracteres.
void write(String s);
Este método escribe una cadena. Simplemente se convierte en una matriz de caracteres y luego se llama al segundo método.
void flush();
Si la secuencia almacena internamente cualquier dato que aún no se haya escrito, este método obliga a que se escriba.
void close();
Este método «cierra» el flujo. Llamas a esto cuando hayas terminado de trabajar con la transmisión.
Luego, el objeto realiza las operaciones de limpieza necesarias para cerrar el archivo, etc. Ya no puede escribir datos en la secuencia y se llama automáticamente al vaciado.

Es importante entender que Reader y Writer son clases abstractas. No hacen nada y prácticamente no contienen código. Todos sus métodos deberán implementarse en las clases que los heredan. Su trabajo es estandarizar cómo interactúan las clases . Los desarrolladores no necesitan inventar sus propios estándares para interactuar entre sí. Es mucho más conveniente para todos mantener algunos estándares básicos. Esto permite que las clases escritas por diferentes programadores interactúen fácilmente no solo con las clases escritas por los creadores de Java, sino también con las clases escritas por otros programadores.

Los estándares son poderosos.

"Estoy de acuerdo. Apoyar estándares comunes es beneficioso para todos".