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