Está en la página 1de 8

Programacin Java Introduccin a Archivos de datos de Entrada Consideremos el siguiente algoritmo: Algoritmo (no modular) para determinar y mostrar

el promedio aritmtico (media aritmtica) de los elementos de cualquier conjunto finito no vac o de n!meros reales" E#$%A&A' P%(P)*I$(' *A+I&A' Un conjunto finito cualquiera no vaco de nmeros reales. Determinar el promedio aritmtico de los elementos en el conjunto. El promedio aritmtico de los elementos en el conjunto.

Pasos' . !nicilia"ar Contador # acumulador aditivo $uma. . Contador % & .' $uma % & '. (ientras )a#a nmeros en el conjunto. '. Considerar el *r+,imo de los nmeros '.' Contador % Contador '.. $uma % $uma - *r+,imo .. Calcular *romedio /ritmtico. .. *romedio /ritmtico % $uma0Contador 1. (ostrar resultados. 1. *romedio /ritmtico Cuando son muc)os los datos de entrada es conveniente almacenarlos en un arc)ivo para luego procesarlos mediante programaci+n. *ara manejar un arc)ivo e,istente de datos2 en general2 )a# que llevar a ca3o los siguientes tres pasos: . Abrir el arc)ivo. Cuando se a3re un arc)ivo se esta3lece una cone,i+n entre el arc)ivo # el programa de computadoras. '. Leer informaci+n del arc)ivo o escribir informaci+n en el arc)ivo. Cuando se lee informaci+n de un arc)ivo2 el arc)ivo se clasifica como un archivo de entrada. Cuando se escri3e informaci+n en un arc)ivo2 el arc)ivo se clasifica como un archivo de salida. .. Cerrar el arc)ivo cuando el programa termine de manejar el arc)ivo.

En general2 )a# dos tipos de arc)ivos: de texto # binarios. Un archivo de texto contiene datos que )an sido codificados como te,to. /unque el arc)ivo contenga nmeros2 estos nmeros se almacenan como te,to en el arc)ivo como una serie de caracteres. Como resultado2 el arc)ivo se puede a3rir # ver su contenido en un editor de te,to como 4otepad. Un archivo binario contiene datos que no se )an convertido a te,to. Como consecuencia2 no se puede ver el contenido de un arc)ivo 3inario con un editor de te,to. De momento2 tra3ajaremos solamente con arc)ivos de te,to. 5ava provee clases est6ndares o predefinidas para tra3ajar con arc)ivos. En general2 para tra3ajar con estas clases predefinidas se de3en incluir la siguientes oraci+nes import: import java.io.*; import java.util.*; En particular2 para leer datos de un arc)ivo se pueden utili"ar las clases predefinidas Scanner # File. 7a clase Scanner discutida anteriormente tam3in se puede utili"ar para leer datos de un arc)ivo. En ve" de usar System.in,que representa el teclado2 como argumento se usa una referencia a un o3jeto de la clase File. Ejemplo' ... import java.io.*; import java.util.Scanner; ... File miArchivo = new File("Datos.txt" ; Scanner lectorDeArchivos = new Scanner(miArchivo ; 7a instrucci+n File miArchivo = new File("Datos.txt" ; crea una instancia de la clase File. 7a clase File est6 en el paquete java.io.* # se usa para representar un arc)ivo. En esa instrucci+n se est6 usando la cadena de caracteres 8Datos.txt8 como argumento. Esto crea un o3jeto tipo 9ile que representa (referencia) el arc)ivo Datos.txt. En este caso diremos que Datos.txt es el nom,re f sico del arc)ivo # miArchivo es su nom,re lgico. *or lo tanto2 se esta3lece una asociaci+n entre el nom3re fsico del arc)ivo # su nom3re l+gico. En la instrucci+n Scanner lectorDeArchivos = new Scanner(miArchivo ; se inclu#e una referencia al o3jeto mi/rc)ivo como argumento. Esto crea un o3jeto de la clase $canner que usa el arc)ivo Datos.txt como su fuente de entrada.

Cuando la aplicaci+n )a#a terminado de leer datos del arc)ivo2 se usa el mtodo close de la clase $canner para cerrar el arc)ivo. *or ejemplo2 si la varia3le lectorDeArchivos referencia o representa un o3jeto de la clase $canner2 entonces la instrucci+n lectorDeArchivos.close( ; cierra el arc)ivo que es la fuente de entrada del o3jeto. Incluyendo una cl-usula throws en el enca,e.amiento de un mtodo Cuando ocurre un evento inesperado durante la corrida de un programa en 5ava2 se dice que el programa produjo una e/cepcin" *or ejemplo2 si se trata de leer m6s datos que los que contiene un arc)ivo2 entonces el programa no puede continuar )asta que la situaci+n se corrija o resuelva. *or lo tanto2 se produce una e,cepci+n # el programa detiene su ejecuci+n. *odemos suponer que una e,cepci+n es una se:al que indica que el programa no puede continuar su ejecuci+n normal )asta que se resuelva el evento inesperado. Cuando se produce una e,cepci+n2 el programa suspende su ejecuci+n o corrida normal. $i un mtodo es capa" de producir una e,cepci+n2 entonces el mtodo de3e tratar de tra3ajar con la e,cepci+n o producirla (tirarla). *ara que el mtodo pueda tra3ajar con la e,cepci+n2 el programador de3e incluir lneas correspondientes de c+digo para indicarle al mtodo posi3les cursos de acci+n a seguir cuando una situaci+n inesperada ocurra; de lo contrario se le de3e permitir al mtodo que produ"ca una e,cepci+n cuando ocurra un evento inesperado. *ara permitirle a un mtodo que produ"ca una e,cepci+n cuando se presente un evento inesperado para el cual no se )a tra3ajado alternativa alguna2 se escri3e una cl6usula throws en el enca3e"amiento del mtodo. 7a cl6usula throws tiene que indicar el tipo de e,cepci+n que se de3e producir. *or ejemplo2
pu!lic static voi" main(Strin#$% ar#s throws &'(xception

Este enca3e"amiento indica que el mtodo main es capa" de producir una e,cepci+n del tipo &'(xception. $i el mtodo main no efecta una operaci+n con arc)ivos2 pero invoca un mtodo que s lo )ace2 entonces tanto el mtodo main como el mtodo que efecta una operaci+n con arc)ivos de3en contener la cl6usula throws &'(xception como parte del enca3e"amiento. De otra forma2 se producir6 un error de compilaci+n.

+eyendo valores de tipos primitivos de un archivo $e indic+ anteriormente que para leer datos de un arc)ivo se pueden utili"ar las clases predefinidas Scanner # File. 7a clase Scanner2 que adem6s de usarse para leer datos entrados por el teclado2 tam3in se puede utili"ar para leer datos de un arc)ivo. En ve" de usar System.in2 que representa el teclado como argumento2 se usa como argumento una referencia a un o3jeto de la clase File. Consideremos nuevamente las siguientes lneas de c+digo: ... import java.io.*; import java.util.Scanner; ... File miArchivo = new File("Datos.txt" ; Scanner lectorDeArchivos = new Scanner(miArchivo ; <ecuerde que cuando discutimos el tema El Sistema Estndar de Entrada de Informacin en Java vimos que la clase $canner provee mtodos para leer valores primitivos. Estos mtodos se llaman next)yte, nextDou!le, nextFloat, next&nt, next*on# y nextShort. Esta clase tam3in contiene mtodos para leer valores de un arc)ivo. =eamos los pasos que )a# que seguir cuando se escri3e un programa que lee datos de un arc)ivo: . 4ecesitamos incluir la instrucci+n import java.util.Scanner; en la secci+n superior del programa para poder utili"ar la clase Scanner. '. >am3in necesitamos incluir la instrucci+n import java.io.*; en la parte superior del programa para poder utili"ar la clase File. .. Como no )emos discutido c+mo tra3ajar cuando se produce una e,cepci+n2 cualquier mtodo que use un o3jeto de la clase $canner para a3rir un arc)ivo de3e contener como parte de su enca3e"amiento la cl6usula throws &'(xception. 1. $e de3e crear un o3jeto tipo File # se usa como argumento el nom3re fsico del arc)ivo como una cadena de caracteres. Por ejemplo' File miArchivo = new File("Datos.txt" ;

?. $e crea un o3jeto tipo Scanner # se usa como argumento una referencia al o3jeto tipo File. Por ejemplo' Scanner lectorDeArchivos = new Scanner(miArchivo ; @. *ara leer valores primitivos se usan mtodos tales como next&nt2 nextDou!le2 # as por el estilo. A. Cuando se termine de leer valores de un arc)ivo se utili"a el mtodo close de la clase Scanner para cerrar el arc)ivo. *or ejemplo2 si la varia3le miArchivo es una referencia a un o3jeto de la clase Scanner2 entonces la siguiente instrucci+n cierra el arc)ivo que es la fuente de entrada del o3jeto: miArchivo.close( ; &etectando el final del archivo Es usual que un programa lea el contenido de un arc)ivo sin sa3er el nmero de valores que se )an guardado en el arc)ivo. Constitu#e un error l+gico el que un programa trate de leer m6s valores que los que un arc)ivo contiene. 7a clase Scanner contiene el mtodo has+ext que se puede utili"ar para determinar si el arc)ivo contiene m6s datos por leer. El mtodo has+ext se invoca antes que cualquier otro mtodo para leer datos de un arc)ivo. $i )a# m6s datos por leer2 entonces el mtodo has+ext devuelve true. $i se llega al final del arc)ivo # no )a# m6s datos por leer2 el mtodo has+ext devuelve ,alse. *or ejemplo2 ... File miArchivo = new File("Datos.txt" ; Scanner lectorDeArchivos = new Scanner(miArchivo ; ... while (lectorDeArchivos.has+ext( .... B -

Posi,le codificacin del algoritmo no modular anterior 0C .ro#rama (jemplo/ (ste pro#rama lee n0meros reales "e un archivo "e entra"a, calcula y muestra su prome"io aritm1tico. Archivo/ .rome"ioAritmetico.java Archivo "e Datos "e (ntra"a/ +umeros.txt C0 import java.util.Scanner;22+ecesario para la clase Scanner import java.io.*;22+ecesario para leer "e un archivo y para &'(xception pu!lic class .rome"ioAritmeticopu!lic static voi" main(Strin#$% ar#s throws &'(xception "ou!le suma = 3.3;22Se iniciali4a el acumula"or a 3.3. "ou!le conta"or = 3.3;22Se iniciali4a el acumula"or a 3.3. 22Se a!re el archivo. File archivoDatos = new File("+umeros.txt" ; Scanner lectorDeArchivos = new Scanner(archivoDatos ; 2*Se leen to"os los valores "el archivo y se calcula su suma.*2 while (lectorDeArchivos.has+ext( -

22Se lee un valor "el archivo. "ou!le numero = lectorDeArchivos.nextDou!le( ; 22Se a5a"e el n0mero a suma y se incrementa conta"or en 6. suma = suma 7 numero; conta"or = conta"or 7 6; 8 22Se calcula el prome"io aritm1tico "ou!le prome"ioAritmetico = suma2conta"or; lectorDeArchivos.close( ;22Se cierra el archivo. 229uestra la suma "e los resulta"os. System.out.println("(l prome"io aritmetico "e los numeros en el archivo"7" +umeros.txt es " 7 prome"ioAritmetico ; 822:ermina el m1to"o main. 822:ermina la clase .rome"ioAritmetico.

Algoritmo modular para determinar y mostrar el promedio aritmtico (media aritmtica) de los elementos de cualquier conjunto finito no vac o de n!meros reales" E#$%A&A' P%(P)*I$(' *A+I&A' import java.util.$canner; import java.io.C;0 clase *romedio/ritmetico(odularD mtodo void main($tringEF args) t)roGs !HE,ception D mensaje!nicial(); dou3le promedio/ritmetico % calcula*romedio/ritmetico(); salida(promedio/ritmetico); B00termina mtodo main mtod void mensaje!nicial()D $#stem.out.println(8Este programa lee nmeros reales de un arc)ivo de entrada2 calcula # muestra su promedio aritmtico.8); B00termina mtodo mensaje!nicial; mtodo dou3le calcula*romedio/ritmetico() t)roGs !HE,ception D dou3le suma& % &; int contador % &; 9ile arc)ivoDatos % neG 9ile(84umeros.t,t8); $canner lectorDe/rc)ivos % neG $canner(arc)ivoDatos); mietras (lectorDe/rc)ivos.)as4e,t())D dou3le numero % lectorDe/rc)ivos.ne,tDou3le(); suma % suma - numero; contador % contador - ; B lectorDe/rc)ivos.close();00se cierra el arc)ivo 00$e procede a calcular el promedio aritmtico dou3le promedio/ritmetico % suma0contador; return promedio/ritmetico; B00termina mtodo calcula*romedio/ritmetico mtodo void salida(dou3le promedio/ritmetico)D $#stem.out.println(8El promedio aritmetico de los numeros en el arc)ivo8-8 4umeros.t,t es 8 - promedio/ritmetico); B00termina mtodo salida B00termina clase *romedio/ritmetico(odular 7 Un conjunto finito cualquiera no vaco de nmeros reales. Determinar el promedio aritmtico de los elementos en el conjunto. El promedio aritmtico de los elementos en el conjunto.

Ejercicio' Codifique el algoritmo modular anterior. 7uego2 compile # corra la aplicaci+n modular correspondiente.