Programación en castellano
Inicio > Tutoriales > J2SE > I/O: Leer y Escibir
-Tutoriales

I/O: Leer y Escibir


Cómo usar DataInputStream y DataOutputStream

Este página muestra cómo usar las clases DataInputStreamy DataOutputStream de java.io. Crea un ejemplo: DataIOTest, que lee y escribe datos tabulares (una factura de merchandising Java).

Los datos tabulares están formateados en columnas, donde cada columna está separada de la siguiente por un tab. Las columnas contienen los precios de venta, el número de unidades pedidas, y una descripción del ítem, de esta forma:

19.99   12      Java T-shirt
9.99    8       Java Mug

DataOutputStream, al igual que otros streams de salida filtrados, debe adjuntarse a algún otro OutputStream. En este caso, se adjunta a un FileOutputStream que está configurado para escribir en un fichero llamado invoice1.txt.

DataOutputStream dos = new DataOutputStream(
                           new FileOutputStream("invoice1.txt"));

Luego, DataIOTest usa métodos especializados writeXXXde DataOutputStream para escribir los datos de la factura (contenida dentro de arrays en el programa) de acuerdo a los tipos de datos que se están escribiendo.

for (int i = 0; i < prices.length; i ++) {
    dos.writeDouble(prices[i]);
    dos.writeChar('\t');
    dos.writeInt(units[i]);
    dos.writeChar('\t');
    dos.writeChars(descs[i]);
    dos.writeChar('\n');
}
dos.close();

Observa que este código cierra el stream de salida cuando ha finalizado.

Luego, DataIOTest abre un DataInputStream sobre el fichero que acaba de escribir.

DataInputStream dis = new DataInputStream(
                          new FileInputStream("invoice1.txt"));

DataInputStream también debe adjuntar algún otro InputStream; en este caso, un FileInputStream configurado para leer el fichero que acaba de escribir --invoice1.txt.

DataIOTest luego sólo lee los datos usando los métodos especializados readXXX de DataInputStream:

try {
    while (true) {
        price = dis.readDouble();
        dis.readChar();       // throws out the tab
        unit = dis.readInt();
        dis.readChar();       // throws out the tab
        desc = dis.readLine();
        System.out.println("You've ordered " + unit
                           + " units of " + desc
                           + " at $" + price);
        total = total + unit * price;
    }    
} catch (EOFException e) {
}
System.out.println("For a TOTAL of: $" + total);
dis.close();

Cuando se han leído todos los datos, DataIOTest muestra una sentencia sumarizando el pedido y la cantidad debida, y cierra el stream.

Observa el bucle que usa DataIOTest para leer los datos desde el DataInputStream.

Normalmente, cuando se lee usaremos un bucle como este:

while ((input = dis.readLine()) != null) {
    . . .
}

El método readLine devuelve un valor, null, que indica que se ha alcanzado el fin del fichero. Muchos de los métodos readXXX de DataInputStream no pueden hacer esto porque cualquier valor devuelto para indicar fin-de-fichero podría ser un valor leído legítimamente desde el stream. Por ejemplo, supongamos que queremos usar -1 para indicar el fin-de-fichero. Bien, no podemos usarlo porque -1 es un valor legítimo que puede ser leído desde el stream de entrada usando readDouble, readInt, o uno de los otros métodos de lectura que leen números.

Por eso el método readXXXde DataInputStream lanza una EOFException en su lugar.

Cuando ocurre EOFException termina el while (true).

Cuando ejecutemos el programa DataIOTest deberíamos ver la siguiente salida:

You've ordered 12 units of Java T-shirt at $19.99
You've ordered 8 units of Java Mug at $9.99
You've ordered 13 units of Duke Juggling Dolls at $15.99
You've ordered 29 units of Java Pin at $3.99
You've ordered 50 units of Java Key Chain at $4.99
For a TOTAL of: $892.88
 
Patrocinados
 

Copyright © 1999-2007 Programación en castellano. Todos los derechos reservados.
Formulario de Contacto - Datos legales - Publicidad

Hospedaje web y servidores dedicados linux por Ferca Network

red internet: musica mp3 | logos y melodias | hospedaje web linux | registro de dominios | servidores dedicados
más internet: comprar | recursos gratis | posicionamiento en buscadores | tienda virtual | gifs animados