I/O: Leer y Escibir

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

COMPARTE ESTE ARTÍCULO

COMPARTIR EN FACEBOOK
COMPARTIR EN TWITTER
COMPARTIR EN LINKEDIN
COMPARTIR EN WHATSAPP
ARTÍCULO ANTERIOR

SIGUIENTE ARTÍCULO