Reader y Writer son las superclases abstractas para streams de caracteres en java.io.
Reader proporciona el API y una implementaci�n para readers-- streams que leen caracteres de 16-bits-- y Writer proporciona el API y una implementaci�n para writers--streams que escriben caracteres de 16-bits.
Las subclases de Reader y Writer que implementan streams especializados se dividen en dos categor�as: aquellos que leen o escriben datos en profundidad (sinks) [mostrados en gris en la siguiente figura] y aquellos que realizan alguna suerte de proceso [mostrados en blanco].
La figura muestra el �rbol de clases para Reader y Writer.


La mayor�a de los programas deber�an usar este tipo de streams, ya que ambos pueden manejar caracteres en el conjunto de caracteres Unicode (mientras que los streams de bytes est�n limitados a bytes ISO-Latin-1 de 8-bit).
�Streams de Bytes
Los programas deber�an usar los streams de bytes, descendientes de InputStream y OutputStream, para leer y escribir bytes de 8-bits. InputStream y OutputStream proporcionan el API y alguna implementaci�n streams de entrada y salida y leen y escriben bytes de 8-bits. Estos streams se usan normalmente para leer y escribir datos binarios como im�genes y sonidos.
Al igual que Reader y Writer, las subclases de InputStream y OutputStream proporcionan I/O especializada que se divide en dos categorias: streams de profundidad y streams de procesamiento. La siguiente figura muestra el �rbol de clases para los streams de bytes.


Como se ha mencionado, dos de las clases de streams de bytes, ObjectInputStream y ObjectOutputStream, se usan para la serializaci�n de objetos.
Esta clases se cubren completamente en la p�gina Serializaci�n de Objetos.
�Entender las Superclases de I/O
Reader y InputStream definen APIs similares pero para diferentes tipos de datos. Por ejemplo, Reader contiene estos m�todos para leer caracteres y arrays de caracteres:
int read() int read(char cbuf[]) int read(char cbuf[], int offset, int length)
InputStream defien los mismos m�todos pero para leer bytes o arrays de bytes:
int read() int read(byte cbuf[]) int read(byte cbuf[], int offset, int length)
Ambos tambi�n proporcionan m�todos para marcar localizaciones en el stream, saltar entradas y restablecer la posici�n actual.
Writer y OutputStream son similarmente paralelas. Writer defien tres m�todos para escribir caracteres y arrays de caracteres.
int write(int c) int write(char cbuf[]) int write(char cbuf[], int offset, int length)
Y OutputStream define los mismos m�todos pero para Bytes.
int write(int c) int write(byte cbuf[]) int write(byte cbuf[], int offset, int length)
Todos estos streams --readers, writers, inputstreams, y outputstreams-- se abren autom�ticamente cuando se crean. Podemos cerrar expl�citamente cualquier stream llamando a su m�todo close.
O el recolector de basura puede cerrarlos impl�citmamente, lo que ocurre cuando se deja de referenciar el objeto.