## Streams de Caracteres y de Bytes

El paquete java.io proporciona clases que permiten conversiones entre streams de caracteres y streams de bytes de texto no-Unicode. Con la clase InputStreamReader, se pueden convertir streams de bytes a streams de caracteres. Se utiliza la clase OutputStreamWriter para traducir streams de caracteres a streams de bytes.

Cuando se crean objetos InputStreamReader y OutputStreamWriter, se debe especificar la codificación que se quiere convertir. Por ejemplo, si queremos traducir un fichero de texto en formato UTF8 a Unicode, deberíamos crear un InputStreamReader de la siguiente forma:

    FileInputStream fis = new FileInputStream("output.txt");
    InputStreamReader isr = new InputStreamReader(fis, "UTF8");

Si se omite el identificador de codificación, InputStreamReader y OutputStreamWriter utilizarán la codificación por defecto. Al igual que la lista de codificaciones soportadas, la codificación por defecto puede variar con la plataforma Java. En la versión 1.1 del JDK, la codificación por defecto es 8859_1 (ISO-Latin-1). Este valor se selecciona en la propiedad del sistema file.encoding. Puedes determinar la codificación que utilizará un InputStreamReader o un OutputStreamWriter llamando al método getEncoding. En el siguiente ejemplo, llamamos al método para determinar que la codificación por defecto de nuestra plataforma sea 8859_1:

    InputStreamReader defaultReader = new InputStreamReader(fis);
    System.out.println(defaultReader.getEncoding());

Se específica un InputStream cuando se crea un InputStreamReader, y un OutputStream cuando se construye un OutputStreamWriter. InputStream y OutputStream son superclases abstractas y todas sus entradas y salidas son streams de bytes, Esto pemite realizar conversiones de cualquiera de los streams de bytes que pertenezcan a sus subclases. Por ejemplo, con un InputStreamReader se puede convertir texto no-Unicode desde un FileInputStream o un PipedInputStream, porque ambas son subclases de InputStream.

En el siguiente ejemplo. veremos como realizar conversiones con las clases InputStreamReader y OutputStreamWriter. El código fuente de este ejemplo lo puedes encontrar en el fichero StreamConverter.java. En este ejemplo, convertimos una secuencia de caracteres Unicode desde un objeto String en un FileOutputStream de bytes codificado en UTF8. El método que realiza la conversión se llama writeOutput:

    static void writeOutput(String str) {

        try {
           FileOutputStream fos = new FileOutputStream("output.txt");
           Writer out = new OutputStreamWriter(fos, "UTF8");
           out.write(str);
           out.close();
        }
        catch (IOException e) {
           e.printStackTrace();
        }
    }

readInput, leemos los bytes codificados en UTF8 desde el fichero creado con el método writeOutput. Utilizamos un InputStreamReader para convertir los bytes de UTF8 a Unicode, y devolver el resultado en un String. Aquí puedes ver el método readInput:

    static String readInput() {

       StringBuffer buffer = new StringBuffer();
       try {
          FileInputStream fis = new FileInputStream("output.txt");
          InputStreamReader isr = new InputStreamReader(fis, "UTF8");
          Reader in = new BufferedReader(isr);
          int ch;
          while ((ch = in.read()) > -1) {
             buffer.append((char)ch);
          }
          in.close();
          return buffer.toString();
       }
       catch (IOException e) {
          e.printStackTrace();
          return null;
       }
    }

En el método main de nuestro programa ejemplo, llamamos al método writeOutput para crear un fichero de bytes codificado en UTF. Luego leemos el mismo fichero, convirtiendo de nuevo los bytes a Unicode. Aquí puedes ver el código del método main:

    public static void main(String[] args) {

       String jaString  =
          new String("\u65e5\u672c\u8a9e\u6587\u5b57\u5217");

       writeOutput(jaString);
       String inputString = readInput();
       String displayString = jaString + " " + inputString;
       new ShowString(displayString, "Conversion Demo");
    }

La cadena original (jaString) debería ser idéntica a la recien creada (inputString). Para ver si las dos cadenas son iguales, las concatenamos y las mostramos con un objeto ShowString. La clase ShowString muestra un string con el método Graphics.drawString. El código fuente de esta clases está en el fichero ShowString.java. Cuando ejemplarizamos un ShowString en nuestro programa ejemplo, aparecen las siguientes ventanas. La repetición de los caracteres mostrados verifica que las dos cadenas son idénticas.

Ozito