CHAPTER 2. LITERATURE REVIEW
2.5 LIVELIHOOD SECURITY, PRO-POOR AND VALUE CHAIN
3
+ String.format("El valor de y con dos cifras "+ " decimales = %.2f%n", y) + String.format("El valor de z con dos cifras "
+ " decimales = %.2f%n", z), "Formateo con el metodo String format", JOptionPane.INFORMATION.MESSAGE);
Entrada/Salida de un archivo
En las secciones anteriores se analizó con algún detalle cómo obtener una entrada desde el teclado (dispositivo de entrada estándar) y enviar la salida a la pantalla (dispositivo de salida estándar). Sin embargo, conseguir la entrada desde el teclado y enviar la salida a la pantalla tiene sus limitaciones. Si la cantidad de datos de entrada es grande, es ineficiente escribir en el teclado cada vez que ejecute un programa. Además de las molestias de tener que escribir grandes cantidades de datos, su introducción puede generar errores, y errores no intenciona- les causan resultados erróneos. El envío de salida a la pantalla funciona bien si la cantidad de datos es pequeña (no más grande que el tamaño de la pantalla), pero suponga que desea distribuir los resultados en un formato impreso. La solución a estos problemas consiste en utilizar una forma alternativa de entrada y salida: archivos. Mediante el uso de un archivo como fuente de datos de entrada, puede preparar los datos antes de ejecutar un programa y este puede acceder a los datos cada vez que se ejecuta. Guardar el resultado en un archivo permite guardar la salida y distribuirla a los demás, y la salida producida por un programa se puede utilizar como entrada para otros programas.
En esta sección se explica cómo obtener datos de otros dispositivos de entrada, como un disco (es decir, el almacenamiento secundario) y cómo guardar la salida en un disco. Java permite que un programa obtenga datos y guarde la salida en un almacenamiento secundario. Un programa puede utilizar la E/S de archivos y leer datos o escribir datos en un archivo. Formalmente, un
archivo se define como sigue:
Archivo: un espacio en el almacenamiento secundario utilizado para conservar información.
En el capítulo 2, aprendió a utilizar un objeto Scanner para introducir los datos de entrada del dispositivo de entrada estándar. Recuerde que en la siguiente instrucción, se crea el objeto
console de Scanner y se inicializa con el dispositivo de entrada estándar:
Scanner console = new Scanner(System.in);
También puede inicializar un objeto Scanner para otras fuentes de entrada diferentes del dispositivo de entrada estándar pasando el objeto apropiado en lugar del objeto Sistema. in. Para esto, se utiliza la claseFileReader de la siguiente manera. (La claseFileReader
está contenida en el paquetejava.io.) Suponga que los datos de entrada se almacenan en un archivo, por ejemplo, prog.dat. La siguiente instrucción crea el objeto ScannerinFile
Scanner inFile = new Scanner(new FileReader("prog.dat")); //Linea 1
Ahora, se utiliza el objeto inFile para introducir datos en el archivo prog.dat, de la misma forma que utilizó el objeto console para introducirlos desde el dispositivo de entrada estándar usando los métodos next, nextInt, nextDouble y así sucesivamente.
NOTA La instrucción en la línea 1 asume que el archivo prog.dat está en el mismo directorio (subdirectorio) en su programa. Sin embargo, si este es un directorio diferente (subdirectorio), debe especificar la ruta donde se encuentra el archivo, junto con el nombre de este último. Por ejemplo, supongamos que el archivo prog.dat está en una memoria flash en la unidad H. Entonces, la instrucción de la línea 1 se debe modificar de la siguiente manera:
Scanner inFile = new Scanner(new FileReader ("h:\\prog.dat")); Observe que hay dos \ después de h:. Recuerde del capítulo 2 que en Java \ es el ca- rácter de escape. Por tanto, para producir una \ dentro de una cadena se necesita \\. (Por otra parte, para estar absolutamente seguro acerca de la ubicación de la fuente don- de se almacena el archivo de entrada, como la unidad flash h:\\, consulte la documen- tación de su sistema.)
NOTA Se supone que un programa lee los datos de un archivo. Debido a que las diferentes compu- tadoras tienen discos rotulados de manera diferente, para simplificar, a lo largo del libro se supone que el archivo que contiene los datos y el archivo con el programa que los maneja están en el mismo directorio (subdirectorio).
Para enviar el resultado a un archivo, utilice la clasePrintWriter, la cual está contenida en el paqueteJava.io.
En resumen, la E/S de archivos en Java es un proceso de cuatro pasos:
1. Importar las clases necesarias de los paquetesjava.util y java.io en el programa. 2. Crear y asociar los objetos adecuados con las fuentes de entrada/salida.
3. Utilizar los métodos apropiados asociados con las variables creadas en el paso 2 de en- trada/salida de los datos.
4. Cerrar los archivos.
Ahora se explican estos cuatro pasos y después se proporciona un esqueleto del programa que muestra cómo podrían aparecer en un programa.
Paso 1, requiere que las clases necesarias puedan importarse desde el paquete java.util y
3
3
import java.util.*; import java.io.*;
Paso 2, requiere que crea y asocie clases de variables adecuadas con las fuentes de entrada/ salida. Ya hemos analizado cómo declarar y asociar objetos Scanner para introducir los datos de un archivo. En la siguiente sección se describe cómo crear los objetos adecuados para enviar la salida a un archivo.
Paso 3, requiere que se lean los datos del archivo de entrada con las variables creadas en el paso 2. En el ejemplo 3-16 se describe cómo leer los datos desde un archivo.
Paso 4, se cierran los archivos de entrada y salida. Para ello, se utiliza el método close, como se describe más adelante en esta sección.
EJEMPLO 3-16 EXAMPLE 2-1
Supongamos que un archivo de entrada, por ejemplo datosEmpleado.txt, se compone de los siguientes datos:
Emily Johnson 45 13.50
El archivo se compone del nombre de un empleado, el número de horas que trabajó y la tarifa de pago. Las siguientes instrucciones declaran las variables necesarias para leer y almacenar los datos en las variables:
// Crear y asociar el objeto Scanner a la fuente de entrada
Scanner in file = new Scanner(new FileReader("datosEmpleado.txt")); String nombre; //variable para almacenar el nombre
String apellido; //variable para almacenar el apellido
double horasTrabajadas; //variable para almacenar las horas trabajadas
double tarifaPago; //variable para almacenar la tarifa de pago
double salarios; //variable para almacenar los salarios
nombre = inFile.next(); //se tiene el primer nombre
apellido = inFile.next(); //se tiene el apellido
horasTrabajadas = inFile.nextDouble(); //se tienen las horas trabajadas
tarifaPago = inFile.nextDouble(); //se tiene la tarifa
salarios = horasTrabajadas * tarifaPago
La siguiente instrucción cierra el archivo de entrada al que inFile está asociado:
inFile.close(); //cerrar el archivo de entrada