Temas:
Motivación.
Un vendedor desea crear una base de datos con los productos que vende, las unidades disponibles y sus precios, con el propósito de no vender productos que no están en bodega y no vender a precios equivocados.
El lugar lógico en donde almacenar esta base de datos es en un archivo en disco. Esta información no se puede tener permanentemente en la memoria del computador, porque (i) se borra cuando se apaga el computador, y (ii) su tamaño es limitado (típicamente unos 64 megabytes, que equivalen a 1024*1024 bytes).
En cambio, el disco permite almacenar datos en forma (i) permanente o persitente (no se borra al apagar el computador), y (ii) masiva (típicamente unos 4 gigabytes, que equivalen a 4096 megabytes).
Desventaja del disco: la manipulación de datos en disco es mucho más lenta que en la memoria del computador.
En este curso crearemos archivos mediante la clase TextWriter y podremos leer su contenido mediante la clase TextReader. Por ejemplo, consideremos un programa que escribe un archivo con nombres de productos que ingresa el usuario. El diálogo entre programa y usuario será:
producto ? jabon Lux
producto ? pasta de dientes Odontine
producto ? ...
jabon Lux
pasta de dientes Odontine
...
(El programa completo se encuentra en Prod.java.)
TextWriter escr= new TextWriter("producto.txt");
print("Ingrese el nombre de un producto: ");
String prod= readLine();
while (compare(prod,"fin")!=0) {
escr.println(prod);
print("Ingrese el nombre de un producto: ");
prod= readLine();
}
escr.close();
En la primera línea el programa fabrica/construye un objeto escritor del archivo ``productos.txt''. Este objeto es la clase TextWriter. Se indica como argumento el nombre del archivo que se va a escribir. El objeto construido queda referenciado por la variable escr, y con él se pueden realizar las siguientes operaciones:
El objeto escr no escribe los datos de inmediato en el disco, si no que espera a formar un lote grande y luego escribirlos en conjunto. Esto resulta más rápido que escribirlos de a uno, porque escribir un byte en disco toma el mismo tiempo que escribir 4 kilobytes.
Después de invocar close() no es posible volver a escribir con el objeto escr.
(Se puede escribir más datos en productos.txt, pero construyento otro objeto.)
(El programa completo se encuentra en LeeProd.java.)
TextReader lect= new TextReader("productos.txt");
String prod= lect.readLine();
while ( ! lect.eofReached() ) {
println(prod);
prod= lect.readLine();
}
lect.close();
En la primera línea se fabrica un objeto lector del archivo ``productos.txt''. El objeto es de la clase TextReader y queda referenciado por la variable lect. Con él se pueden realizar las siguientes operaciones:
El último dato leído es válido sólo si lect.eofReached() entrega falso (false).
En realidad esta operación no es muy útil en archivos de lectura y se puede omitir en la mayoría de los casos.
Ejercicio:
Escribir un programa que dialogue con el usuario para escribir un archivo ``productos-precios.txt'' que incluya producto y precio. El programa debe aprovechar los productos almacenados en ``productos.txt'' para que el usuario no tenga que digitarlos nuevamente. Diálogo:
Precio de jabon Lux ? 344
Precio de pasta de dientes Odontine ? 415
...
jabon Lux 344
pasta de dientes Odontine 415
...
(El programa completo se encuentra en
ProdPrecio.java.)
TextReader lect= new TextReader("productos.txt");
TextWriter escr= new TextWriter("productos-precios.txt");
String prod= lect.readLine();
while ( ! lect.eofReached() ) {
print("Precio de "+prod+" ? ");
int precio= readInt();
escr.println(prod+" "+precio); // (*)
prod= lect.readLine();
}
lect.close();
escr.close();