Archivos

Objetivos: Mostrar cómo se pueden escribir y leer datos en archivos.

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.

Escritura de Archivos

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 ? ...
El programa debe escribir el archivo ``productos.txt'' de tal forma que su contenido al editarlo con NotePad o WordPad sea el siguiente:
    jabon Lux
    pasta de dientes Odontine
    ...
El programa que realiza este diálogo y escribe el archivo es el siguiente:

    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();
(El programa completo se encuentra en Prod.java.)

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:


Lectura de un archivo

Se desea escribir un programa que despliegue en pantalla los productos almacenados en el archivo ``productos.txt''. El programa es:

    TextReader lect= new TextReader("productos.txt");
    String prod= lect.readLine();
    while ( ! lect.eofReached() ) {
      println(prod);
      prod= lect.readLine();
    }
    lect.close();
(El programa completo se encuentra en LeeProd.java.)

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:


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
    ...
El archivo productos-precios.txt escrito debe ser:

    jabon Lux 344
    pasta de dientes Odontine 415
    ...
El programa es:

    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();
(El programa completo se encuentra en ProdPrecio.java.)