UNIVERSIDAD NACIONAL MAYOR DE SAN MARCOS Facultad de Ingeniería de Sistemas e Informática

GUIA DE PRÁCTICA 9
ASIGNATURA TEMA PROFESOR ALUMNO FECHA CICLO TURNO SEMESTRE 1. OBJETIVOS Que el estudiante: • Use y manipule los mecanismos de persistencia para registrar la información en java Algorítmica II PERSISTENCIA Carlos A. Ruiz De La Cruz Melo

2008-1

2. INTRODUCCION TEORICA
Normalmente, cuando se codifica un programa, se hace con la intención de que el programa pueda interactuar con los usuarios del mismo, es decir, que el usuario pueda pedirle que realice determinada tarea, suministrándole datos con los que debe llevar a cabo la tarea solicitada. Se espera que el programa los manipule de alguna forma, proporcionando una respuesta a lo solicitado. Por otra parte, en muchas ocasiones interesa que el programa guarde los datos que se le han introducido, de forma que al finalizar el proceso, los datos no se pierdan y puedan ser recuperados en una sesión posterior. La forma habitual de hacer esto es mediante la utilización de dispositivos de almacenamiento secundario o externo (normalmente un disco). Se llama persistencia a la capacidad de una entidad de trascender el tiempo o el espacio. En la programación previa al paradigma de objetos estaba representada con la entrada y salida de datos. Es un concepto importante, pues permite que un objeto pueda ser usado en diferentes momentos

2.1. Flujos
El modelo más sencillo de un algoritmo consiste en tres conexiones: datos de entrada, procesamiento y datos de salida. Entrada y salida ( E / S ) es un aspecto fundamental en la computación. La computadora no sería muy útil si no pudiera recibir datos del mundo exterior y presentar los datos computados. En esta sección se describe como Java , a través de java.io y java.nio, y otros paquetes relacionados , proporciona clases independientes para manipular archivos y flujos ( streams ).

Profesor: Carlos A. Ruiz De La Cruz Melo

1

2.1.2 Los flujos estándar
Java al igual que cualquier otro lenguaje de programación tiene su conjunto métodos que le permiten captar la información de flujos de entrada y enviar flujos de salida por dispositivos estándar. Los flujos estándar son: • Flujo de datos de entrada: o Se realiza mediante la clase System.in y suele recibir los datos del teclado o Utiliza el método read() para conseguir leer los caracteres del teclado • Flujo de datos de salida: o Se realiza mediante la clase System.out y suele enviar los datos por pantalla o • o Utiliza el método print() y println() para la salida por pantalla Se realiza mediante la clase System.err Flujo de datos de error o Nos aseguramos que la salida va redirigida al monitor para enviar mensajes de error al usuario El flujo de entrada más utilizado esta asociado a el teclado, veamos el siguiente ejemplo que es bastante ilustrativo. /** * Ejemplo: programa de flujos (streams) * que lee tu nombre de la línea de comandos * y te lo muestra por la consola de salida. * Curso de Java Básico * @author Oscar A. González Bustamante * @version 1.0 * Archivo: HolaOscar.java */

import java.io.*; public class HolaOscar { public static void main(String[] args) throws IOException { InputStreamReader lector = new InputStreamReader(System.in); BufferedReader entrada = new BufferedReader(lector); System.out.print("Cual es tu nombre? "); String nombre = entrada.readLine(); System.out.println("Hola " + nombre + "!"); } }// fin de la clase HolaOscar

Profesor: Carlos A. Ruiz De La Cruz Melo

2

La salida del programa al ejecutarlo con el comando java HolaOscar es: Da tu nombre: Oscarin ¡Hola, Oscarin! En la siguiente figura vemos el proceso de tomar los datos del flujo estándar de entrada System.in asociado al teclado con la creación del objeto lector de la clase InputStreamReader . Luego con el objeto lector lo utilizamos como argumento del constructor de un objeto entrada de la clase BufferReader , el cual tiene métodos como readLine() , para leer el conjunto de bytes del buffer hasta el final de la línea. Finalmente utilizamos el método println() de System.out que esta asociado al flujo estándar de salida para presentar los datos por la consola o monitor.

2.1.2.1 Algunos ejemplos de flujo estándar
En los ejemplos siguientes, usamos el flujo estándar de entrada System.in asociado al teclado. Todo lo que se lea de algún flujo de entrada esta dado en bytes , los cuales son transformados a cadenas de caracteres. ¿Entonces como hacemos la lectura de algún número real o entero por teclado?. Afortunadamente existen métodos de conversión de cadenas en las clases envoltorio ( wrappers ) como doubleValue() que convierte una cadena en formato de número real a una variable primitiva de tipo double. Así es como podemos entonces manejar los flujos de datos de bytes o caracteres a formatos binarios

Profesor: Carlos A. Ruiz De La Cruz Melo

3

específicos. También observe que el método main() se esta manejando la excepción IOException , para preveer algún tipo de error en el flujo de entrada o salida. ver el ejemplo: /** * Ejemplo: programa de flujos (streams) * que lee el valor del radio desde el teclado y calcula * el área del circulo. La cadena del número see lee * con un flujo de entrada que luego es convertido a * formato de número de tipo double con doubleValue() * de la clase wrapper Double . El programa calcula el * área del circulo en base al radio dado y presenta el * resultado por pantalla. * @author Oscar A. González Bustamante * @version 1.0 * Archivo: AreaCirculo.java */ import java.io.*; public class AreaCirculo{ public static void main(String[] args) throws IOException { InputStreamReader lector = new InputStreamReader(System.in); BufferedReader entrada = new BufferedReader(lector); System.out.print("Introduce valor del radio: "); String texto = entrada.readLine(); Double x = new Double(texto); double r = x.doubleValue(); System.out.println("El area de un circulo de radio "+ r ); double area = r*r*Math.PI; System.out.println(" es " + area); } }// fin de la clase AreaCirculo Para correr el programa hay que ejecutar la sentencia java AreaCirculo y presenta los siguientes resultados si se le da como radio el valor de 10. Introduce valor del radio: 10 El area de un circulo de radio 10.0 es 314.1592653589793

2.1.3 Los flujos que ofrece java.io
Java ofrece dos clases abstractas para manejar los flujos de datos procedentes de equipos remotos o archivos y son java.io.OutputStream y java.io.InputStream, a continuación presentamos la jerarquía de estas clases clases . Object o InputStream · FileInputStream

Profesor: Carlos A. Ruiz De La Cruz Melo

4

read(). 2..4 Flujos de bytes Para los ejemplos siguientes. sin preocuparnos de como han sido creados (de hecho. Lectura de varios bytes. el método read() devuelve un valor de -1. El siguiente ejemplo de fragmento de código lee 1024 bytes de un flujo de entrada. En caso de que se haya alcanzado el final del archivo. Hay que darse cuenta que el byte (8 bits) se devuelve como un dato de tipo int (32 bits). con un valor entre 0 y 255.o FilterInputStream § § § PushbackInputStream BufferedInputStream LineNumberInputStream · · o OutputStream · · · · StringBufferInputStream o o ByteArrayInputStream PipedInputStream SequenceInputStream ByteArrayOutputStream PipedOutputStream FileOutputStream FilterOutputStream o o o PrintStream BufferedOutputStream DataOutputStream Algunas de estas clases van a aparecer junto con algunos de sus métodos.. Primero se crea un arreglo unidimensional del tamaño adecuado.1. Así podemos obtener el siguiente byte del InputStream. int b = is. las clases mencionadas ya habíamos dicho que son clases abstractas que y no pueden ser instanciadas . byte[] = miArreglo = new byte[1024].. así que son la base de otras clases concretas de donde si podemos instanciar objetos ). en los ejemplos que veremos mas adelante. Ruiz De La Cruz Melo 5 . supondremos que los objetos de tipo InputStream y OutputStream nos vienen dados. public abstract class InputStream extends Object Lectura de bytes individuales: Se logra mediante código como: InputStream is= . Profesor: Carlos A. // declaramos el arreglo. El tamaño de este arreglo es lo que indica al método read() cuántos bytes debe leer como máximo.

read(miArreglo). * @author Oscar A.out.println() a * la pantalla o consola de salida. " + nombre. Luego instanciamos * dos objetos de la clase String con dichos buffers. De cualquier forma. porque los datos de una conexión de red tardan en llegar.in... byte[] buffer2 = new byte[LON]. LON) . Ejemplo: Profesor: Carlos A. try { System. OSCAR GONZALEZ Cerrar el flujo de entrada. Escritura de bytes individuales.read(buffer2. } catch (Exception e) {} String nombre = new String(buffer2) . 0. porque puede ser menor debido a que estamos leyendo de un archivo que se ha acabado. System. La clase OutputStream dispone de varios métodos write(). byte[] buffer1 = new byte[LON].out. LON) . Si se llega al final del archivo. System. y usamos el método * trim() para eliminar los espacios blancos o vacíos. La variable lee almacena el número de bytes que se han leído en realidad. 0.out. /** * Ejemplo: programa de flujos (streams) * que lee el flujos de bytes. cuando el método read() devuelva un valor distinto de -1 podemos seguir leyendo mediante sucesivas llamadas a read(). try { System.trim()).java */ public class EscribeNombres { public static void main(String[] args) { final int LON = 20 . devuelve el valor de -1.print("Introduce tu apellido: ")..in. Veamos el siguiente ejemplo que muestra el uso del método read() para leer bloques de bytes. No hay garantía de leer exactamente el número de bytes especificado. int lee = is.read(buffer1. System. se tienen que liberar los recursos reservados mediante el método close(). Cuando ya no necesitamos leer datos de un flujo de entrada.0 * Archivo: EscribeNombres. Ruiz De La Cruz Melo 6 . González Bustamante * @version 1. Si no cerramos el InputStream explícitamente.println("Hola .trim() + " " + apellido. } catch (Exception e) {} String apellido = new String(buffer1) .out. * Ambos tiene un tamaño específico de 20 bytes y * son leídos con el método read(). o cualquier otra causa.InputStream is = . * Finalmente los enviamos por System. } } // fin de la clase EscribeNombres La salida del programa al ejecutarlo con el comando java EscribeNombres es: Introduce tu apellido: GONZALEZ Introduce tu nombre: OSCAR Hola . Las cadenas a leer se * almacenan en los arreglos de bytes buffer1 y buffer2.print("Introduce tu nombre: "). el flujo asociado se cierra cuando se destruye el objeto.

El código siguiente es muy ilustrativo. write() .println("Hubo un error al abrir el flujo tal y tal .. Estas excepciones es obligatorio capturarlas. byte[] vector = { 65. Ruiz De La Cruz Melo 7 . os. avaible() .err.. os.io. 67.. 69}.write(dato)..IOException en el método lee_doble() .write(vector). catch Ejemplo: try { InputStream is= . las partes de los programas que trabajen con los flujos deben estar dentro de una cláusula try . Por ejemplo: public static void main(String[] args) throws IOException { // programa creado por un programador flojo } El siguiente programa calcula el área de un triángulo. // escribe los bytes 65.OutputStream os = .write(vector.. // escribe los bytes 66. Como en el caso del método read() de la clase InputStream .. ) { // Leemos y procesamos datos involucrados con los flujos } }catch(IOException ioe) { System.. "). el programa correrá.68.io. a utilizar algún otro método más actualizado para dicho fin.1.printStackTrace().67. o aparecerán errores en tiempo de compilación.. etc. Profesor: Carlos A.67.IOException . } En programas pequeños en los que no se quiera complicarse la existencia con estructuras de éste tipo. lanzan excepciones de tipo java. 66. 66. OutputStream os = . el método write() recibe un byte dentro de una variable de tipo int (32 bits).. Escritura de varios bytes.. ioe.5 Gestión de excepciones de entrada / salida Todos los métodos read(). Si al compilar el programa le manda un warning de que el método readLine() esta desaprobado ( deprecated ). y hace uso del manejo de excepciones para los flujos de entrada de tipo java. 68.69 os. En general.. while ( . int dato = 777..3). se puede tomar el camino alternativo de mandar la excepción "hacia arriba". es solo una advertencia del compilador de Java que le invita a ud..68 2.1. no se preocupe mucho por eso.

print(msj).0".println("p= " + p).0.0.doubleValue(). c = lee_doble("Dame lado c: ").p.lang.out. strng = stream. * El programa utiliza manejo de excepciones * de tipo java.out. } catch ( java. class AreaTriangulo{ static double lee_doble(String msj) { DataInputStream stream = new DataInputStream(System.valueOf(strng).IOException e ) { strng = "0.sqrt( p*(p-a) * (p-b) * (p-c) ).0 * Archivo: AreaTriangulo. p = ( a + b + c ) / 2. a = lee_doble("Dame lado a: "). González Bustamante * @version 1. * @author Oscar A. } catch ( java./** * Ejemplo: programa de flujos (streams) * que lee el un flujo de datos por el teclado * y lo convierte a un valor de tipo double.println("a= "+ a + " b = " + b + " c= " + c).out. String strng.in). // escriba una linea para leer desde el teclado. System.readLine(). } // tratando de convertir este valor a un valor de tipo double try { aux = Double.println("Calcular Area de un triangulo").println("fin del programa").println("Area = " + s ). } return aux. double aux.out. System.b.java */ import java. } public static void main (String args[] ) { double a. Ruiz De La Cruz Melo 8 .NumberFormatException e) { aux = 0.DataInputStream. s = Math. System. try { System. System. Profesor: Carlos A.io. System. double s.c.io.out.io.out.IOException. b = lee_doble("Dame lado b: ").

estos se manipulan con flujos de acceso a archivos. Mediante la clase File no nos limitamos a leer el contenido del archivo. su tipo. los permisos de acceso que tenemos con él.0 b = 40. y la clase FileOutputStream para el caso de un archivo de salida. la clase File es la única forma que tenemos de trabajar con directorios (crearlos.0 fin del programa 2. etc.0 c= 50. ver los archivos que contienen. Es muy importante darse cuenta de la diferencia entre un objeto de tipo File y el archivo o directorio al que se refiere. 2. su fecha de creación.7 La clase File En el caso de la clase File esta se utiliza para encapsular la interacción de nuestros programas con el sistema de archivos.exists()) { // El archivo existe } Profesor: Carlos A.0 p= 60.6 Flujos de acceso a archivos Ya sea para leer o para escribir en un archivo.txt que aparece en el fragmento de código anterior no tiene porque existir. Hay otras dos variantes: una que recibe un objeto de tipo File y otra que recibe un objeto de tipo FileDescriptor. etc. el archivo c:\cursojava\elarchivo. La clases FileInputStream y FileOutputStream reciben en uno de sus constructores como parámetro el nombre del archivo a leer o escribir. if (elArchivo. Además. Ruiz De La Cruz Melo 9 .1. En la sección siguiente veremos la primera variante y como se utiliza la clase File para dicho fin. sino que podemos obtener información adicional.0 Area = 600.txt"). cambiar el nombre o borrar los archivos. En Java tenemos la clase FileInputStream . Por ejemplo. como el tamaño del archivo.). ejemplo: File elArchivo = new File("c:\\cursojava\\elarchivo. Para saber si un objeto File se refiere a un archivo existente podemos usar el método exists().1.} } // fin de la clase AreaTriangulo La salida del programa al ejecutarlo con el comando java AreaTriangulo es: Calcular Area de un triangulo Dame lado a: 30 Dame lado b: 40 Dame lado c: 50 a= 30. La forma más sencilla de crear un objeto File es: File elArchivo = new File("c:\\cursojava\\elarchivo. como ocurría con la clase FileInputStream.txt"). con los métodos necesarios para abrir e interactuar con un canal de comunicación hacia un archivo de entrada para nuestra aplicación.

// Nombre (sin carpeta) del archivo String dir = f.lastModified().length(). si se puede borrar. // Fecha última de modificación o actualización if ( f. // Directorio o carpeta del archivo if ( f. si se puede leer el archivo. si se ha borrado con éxito el archivo.canWrite(). Veamos los siguientes fragmentos de código : File f = new File("c:\\cursojava\\elarchivo.canRead().isFile() ) { // es un archivo normal } else { // no es un archivo normal } long modificado = f. Los siguientes fragmentos de código que se muestran a continuación ejemplifican como se puede trabajar con carpetas o directorios mediante la clase File. el nombre de la carpeta donde se encuentra el archivo. como .txt"))) { // Nombre de archivo modificado } else { // nombre de archivo no modificado } La clase File. // ¿Podemos escribir el archivo ? if ( f.getParent().delete()) { // archivo borrado con éxito } else { // el archivo no se ha podido borrrar } String nombre = f. long = f.isDirectory() ) { // Es un directorio } else { // No es un directorio } if ( f. si se puede escribir en el archivo.else { // El archivo no existe } Se puede obtener más información de un objeto de la clase File.getName(). // ¿Podemos leer el archivo ? boolean escritura = f.txt"). Ruiz De La Cruz Melo 10 .renameTo( new File("c:\\cursojava\\otroArchivo. también nos permite manejar carpetas. Profesor: Carlos A. // tamaño del archivo boolean lectura = f. etc. File f = new File ("c:\\cursojava"). el tamaño del archivo.

print(c).1 Ejemplos de la clase File En este primer ejemplo de la clase File muestra el uso de algunos de sus métodos para manejo de archivos: /** * Programa de java que ejemplifica el uso * de la clase File. static void prhr(char c. new String("IncrementoDecremento. i < lista. } public static void main(String[] argumentos) { int parcial. i++) System. import java.*.list().Date. escritura. public class FlujoArchivos2 { static String ruta = "C:\\j2sdk141\\ejemplos\\". char car.io. if ( t. if ( w.java") }. */ } else { /* No se pudo crear el directorio */ } 2. static String[] archivos = { new String("Aeropuerto.java */ import java. demostrando el acceso a * archivos y carpetas * @autor Oscar A. directorio. Ruiz De La Cruz Melo 11 .7.0 * Archivo: FlujoArchivos2.out.1.length.String[] lista = f.java"). // obtenemos la lista de archivos for ( int i=0.total=0. String nombre. González Bustamante * @version 1. int lim) { for(int i=0.mkdirs() ) { /* Se ha creado el directorio deJava junto con los directorios intermedios necesarios.mkdir() ) { // Se ha creado un directorio ejemplos sobre c:\cursojava previamente existente } else { // no se pudo crear el directorio } File w = new File("c:\\cursojava\\alumnitos\\aplicados\\estudiosos\\deJava").out. Profesor: Carlos A. File t = new File("c:\\cursojava\\ejemplos" ). boolean lectura.util.println("Archivo n° " + i + ":" + lista[i]). i++) // los imprimimos System.tamaño=0. static String archi = archivos[1]. i<lim .

out. if (lectura && escritura ) System.80).lastModified(). while(( parcial=fis. System.out.length() + " Bytes"). car = (char)parcial. fis.out.getParent(). // ¿se puede leer el archivo ? escritura = f. lectura = f. System.out.exists() ) { // mas datos sobre el archivo System.out.out. Ruiz De La Cruz Melo 12 .prhr('\n'. } else System.out. prhr('-'. /* Nombre (sin directorio) del archivo */ directorio = f.println("\tEs una archivo de lectura y escritura\n"). try { File f = new File(ruta+archi).println(" El archivo: " + archi + " no existe en : " + ruta). } catch (FileNotFoundException fnfe) { /* Archivo no encontrado */ Profesor: Carlos A.canRead().getName().80).canWrite().out.out.1).print(car).println("\tEs un archivo de escritura\n").prhr('\n'.out. prhr('-'. else if( escritura ) System. System.1). /* Fecha de última modificación */ Date d = new Date(modificado).println("\tEs un archivo de solo lectura\n"). // ¿se puede escribir el archivo? nombre = f. FileInputStream fis = new FileInputStream(f). } System. else if( !lectura && !escritura) System.close().println("\tTamaño del archivo(compararlo al final): " + f.read())!=-1) { total+= parcial. System.out.println("Nombre del directorio o carpeta del archivo : " + directorio).println("Fecha de última modificación : "+ d).println("Nombre del archivo: " + nombre).print("\n"). /* Directorio del archivo */ modificado = f. System.long modificado. else if( lectura && !escritura) System. tamaño++.println("\tArchivo : "+archi+ " encontrado con éxito en: "+ ruta).out.println("\tEs un archivo que no se puede leer ni escribir\n"). if (f.

Ruiz De La Cruz Melo 13 . System.*. System.out.io.java:604 Bytes) Fin del programa Profesor: Carlos A.out.println("k = " + k). Error: " + ioe.err.java que se encuentra en la carpeta C:\j2sdk141\ejemplos\ es: -------------------------------------------------------------------------------Archivo : IncrementoDecremento. System. System. k -= 4.out. byte j = 127. System.println("j = " + j).println("c = " + c).getMessage()). System. System.println("j = " + j). } }//?> -----------------------------------------------------------El tamaño del archivo:(IncrementoDecremento. --j.out.1).println("Error al leer el archivo. System.System.println("c = " + c).println("k = " + k).println("Fin del programa"). public class IncrementoDecremento { public static void main(String[] args) { char c = 'R'. ++c.60). } //fin del main() } //fin de la clase FlujoArchivos2 La salida del programa al ejecutarlo con el comando java FlujoArchivos2 y que muestra el archivo IncrementoDecremento. short k = 32767. } System.java encontrado con éxito en: C:\j2sdk141\ejemplos\ Tamaño del archivo(compararlo al final): 604 Bytes Es una archivo de lectura y escritura Nombre del archivo: IncrementoDecremento.println("Archivo no encontrado.println("j = " + j).out. ++c.getMessage()). } catch (IOException ioe) { /* Error al leer */ System.println("\tEl tamaño del archivo:("+archi+":"+tamaño+" Bytes)").out.println("k = " + k).err. k += 5. ++j.java Nombre del directorio o carpeta del archivo : C:\j2sdk141\ejemplos Fecha de última modificación : Fri Aug 10 20:17:24 GMT-06:00 2001 -------------------------------------------------------------------------------import java.out.out. System. } finally { prhr('-'. Error: " + fnfe. ++j.prhr('\n'.out.println("c = " + c). System.out.out.out.println("j = " + j). System.

Ruiz De La Cruz Melo 14 .println("Fin del programa"). i<lista. } System. } else System.println(msg). } static void prln(String msg) { System.*.out.println(" El directorio: " + ruta + " no existe "). i++) System. González Bustamante * @version 1.length.prhr('\n'.list().print(c).io.out. /* Obtenemos la lista de archivos */ for (int i=0.out. prhr('-'.Date. i<lim . } finally { prhr('-'.print(msg).println("Directorio no encontrado. public class FlujoArchivos3 { static String ruta = "C:\\j2sdk141\\ejemplos\\E-S\\". Error: " + e. static void prhr(char c.El segundo ejemplo de la clase File muestra el uso de algunos de sus métodos para manejo de carpetas o directorios: /** * Programa de java que ejemplifica el uso * de la clase File para demostrar * el manejo de carpetas o directorios * @autor Oscar A. } public static void main(String[] argumentos) { try { File f = new File(ruta).1). } static void pr(String msg) { System. if (f.util. } // fin del main } //fin de la clase FlujoArchivos3 La salida del programa que muestra el contenido de archivos de la carpeta de mi computadora C:\\j2sdk141\\ejemplos\\E-S\\ .out.1). static String[] lista.out.getMessage()). int lim) { for(int i=0.java */ import java. al ejecutarlo con el comando java FlujoArchivos3 es: -------------------------------------------------------------------------------- Profesor: Carlos A.exists() ) { lista = f.err. import java. i++) /* los imprimimos */ prln("Archivo n\u00B0 "+(i+1)+": " + lista[i]).60). } catch (Exception e) { /* directorio no encontrado */ System.0 * Archivo: FlujoArchivos3.prhr('\n'.80).

java Archivo n° 24: EvaluadorArchi.java Archivo n° 21: Estudiantes.write(k). Hay varias formas de realizar esto.class Archivo n° 25: EvaluadorArchi.java Archivo n° 19: EsencialJDBC.java Archivo n° 28: EvaluadorBD2.class Archivo n° 10: Copy.doc Archivo n° 13: entrada.java Archivo n° 26: EvaluadorArchivos2. prácticamente simétricas a las utilizadas para leer archivos.class Archivo n° 27: EvaluadorArchivos2. k<=10.sql -----------------------------------------------------------Fin del programa 2.java Archivo n° 30: EvaluadorBD3.class Archivo n° 20: EsencialJDBC.java Archivo n° 44: salida.txt").java Archivo n° 34: FlujoArchivos2. /* Escribiremos los números del 1 al 10 en el archivo */ for ( int k=0.java Archivo n° 33: FlujoArchivos1.class Archivo n° 3: alumnosxsqlserver2000.class Archivo n° 29: EvaluadorBD2.txt Archivo n° 14: ENTSAL.class Archivo n° 37: FlujoArchivos3. todas.lnk Archivo n° 49: tablaALUMNOSXsqlserver2000. Ruiz De La Cruz Melo 15 .class Archivo n° 23: Evaluador.java Archivo n° 32: Flujo1.8 La clase FileOutputStream El próximo paso es el esperado: abrir un archivo y escribir en él.class Archivo n° 43: PrintNames. k++) { fos.class Archivo n° 47: Sumatorias.class Archivo n° 39: MiAccesoJDBC.class Archivo n° 17: EscribeNombres.txt Archivo n° 45: src Archivo n° 46: Sumatorias.sql Archivo n° 4: ArchiEnt.java Archivo n° 36: FlujoArchivos3.class Archivo n° 40: MS-DOS.java Archivo n° 48: Símbolo del sistema.txt Archivo n° 5: ArchivoEnt. fos = new FileOutputStream("c:\\cursojava\\salida.txt Archivo n° 2: Alumno.txt Archivo n° 22: Evaluador.doc Archivo n° 12: E-SenJava.1.class Archivo n° 18: EscribeNombres. Profesor: Carlos A.bak Archivo n° 15: ENTSAL.LNK Archivo n° 41: Persona.txt Archivo n° 8: classes Archivo n° 9: Copy.jde Archivo n° 16: Escribe.java Archivo n° 11: E-ASAjava.java Archivo n° 38: Mi2doAccesoJDBC.class Archivo n° 35: FlujoArchivos2.class Archivo n° 31: EvaluadorBD3.class Archivo n° 7: ArchivoSal. Ejemplo: /* Creamos un stream de salida sobre el archivo */ FileOutputStream fos.Archivo n° 1: Alumnitos.class Archivo n° 42: PrintNames.class Archivo n° 6: ArchivoSal.

agregar el código de cerrar los flujos de entrada fis y salida fos con el método close() .read(buffer))>0) fos. Si el archivo origen no existe. try { FileInputStream fis = new FileInputStream(origen). Otro ejemplo puede ser el comando copy de MS-DOS: /** * Ejemplo: programa de flujos (streams) * que ejemplifica el uso de las clases * FileInputStream y FileOutputStream para * programar el comando copy de MS-DOS * El programa utiliza manejo de excepciones * de tipo java.0 * Archivo: Copy.java */ import java. Ruiz De La Cruz Melo 16 . while((cuenta=fis. Cabe señalar que si el archivo destino ya existe.txt" El programa copiará el contenido de un archivo en el otro.IOException.} fos. será borrado. La ruta y archivo de origen y destino son los argumentos del método main() . González Bustamante * @version 1. ioe.9 La clase DataOutputStream Profesor: Carlos A. en bloques de 1024 bytes con el método read() leyendo del archivo origen . el catch del programa nos notificará y volacará en pantalla el contenido de la pila de llamadas. int cuenta. String destino = args[1]. 2.txt "c:\Mis Documentos\archivo2.err.io. Por supuesto se deja al lector de este material. FileOutputStream fos = new FileOutputStream(destino).printStackTrace().cuenta). * @author Oscar A.0. } catch(IOException ioe) { System.println("Se ha producido un error").io. al archivo destino con el método write(). byte buffer[] = new byte[1024].*. class Copy { public static void main(String[] args) { String origen = args[0].write(buffer.close(). } } // fin del método main() } // fin de la clase Copy Si ejecutamos el programa Copy con el comando : java Copy c:\temporal\archivo1.1.

y los escribirá en el OutputStream subyacente. tendríamos que dividir los 32 bits en cuatro paquetes de 8 bits cada uno. // Escribimos un número de precisión doble (8 bytes) dos. Ruiz De La Cruz Melo 17 . // Creamos el flujo de salida DataOutputStream dos = new DataOutputStream(os).8839. etc. Como veremos. A pesar de que con estas técnicas podríamos leer y escribir cualquier cosa en un archivo. una matriz en memoria. Cada vez escribamos un dato "complejo" en un objeto DataOutputStream . un entero de 32 bits en un archivo. Profesor: Carlos A. un archivo. Veamos algunos ejemplos: OutputStream os = .close(). float. // Escribimos un número de precisión simple (4 bytes) dos. Este lo traducirá a bytes individuales.. double c = 747. writeChar() .writeDouble( c ). pero no restringidos únicamente a bytes y a matrices de bytes. le pasamos como parámetros el OutputStream a su constructor. es una extensión de la clase OutputStream . esta forma de trabajar es relativamente pesada. como en el caso de OutputStream . la salida estándar. . por ejemplo. leer cuatro bytes del flujo y combinarlos para obtener el número de 32 bits. un socket.) y lo "envolvemos" en un objeto DataOutputStream .. ya que cada vez que quisiéramos escribir. uno para cada tipo de dato primitivo: writeBoolean(). Mediante la clase DataOutputStream podemos escribir datos de tipo int. La clase DataOutputStream La clase DataOutputStream . e ir transmitiéndolos a través de flujo de datos.writeInt(a). Además podemos escribir algunos objetos. char. en realidad nos referimos a tipo de datos primitivos.close(). // Escribimos un entero en el stream (4 bytes) dos. etc. sin que nosotros tengamos que preocuparnos de la forma en que lo hace. como datos de tipo String . dos.Los programas que se han visto hasta ahora solo escriben bytes en un flujo de datos. float b= 3.42552. Cuando hablamos de datos "complejos". Para crear este DataOutputStream . double. el paquete java. writeLong() y writeShort(). de forma que podamos usar la interfaz que nos proporciona este último. En la documentación del SDK de Java podemos encontrar otros métodos. writeByte() . Los nombres de los métodos usados son bastante descriptivos por sí mismo. y añade a ésta última la posibilidad de escribir datos "complejos" en un flujo de salida. el proceso sería el inverso. en una gran cantidad de formatos.io nos proporciona varias herramientas para facilitarnos este trabajo. La forma general de trabajar con objetos de tipo DataOutputStream es la siguiente: obtenemos un objeto OutputStream (cuyo origen puede ser cualquiera. os.writeFloat( b ). Para leer ese dato. int a = -7.

sin añadir ningún delimitador ni de principio ni de fin de cadena. escribe n valores char.writeChars(cadena2): dos.Si seguimos explorando el SDK. será legible correctamente por un DataInputStream . dos. float y. String cadena3 = "Me voy a descomponer en una cadena de texto en formato UTF-8 ". Un fragmento de código ejemplo de utilización de estos métodos es: Strng cadena1 = "Me voy a descomponer en una cadena de texto de bytes individuales". int x. Profesor: Carlos A. por lo que si otro programa necesita leer los datos que nosotros hemos escrito. x = dis.10 La clase DataInputStream Si podemos escribir datos formateados entonces también podemos leerlos cómodamente. es necesario conocer con anticipación la longitud de la cadena.writeBytes(cadena1). Si no sabemos esto. Ruiz De La Cruz Melo 18 . Si la cadena consta de n letras. writeChars() y writeUTF() .. Esta función es posible porque disponemos de la clase DataInputStream . dos. • writeUTF() escribe la cadena en un formato conocido como UTF-8. Los otros dos métodos no incluyen información sobre la longitud de la cadena. 2. sin añadir ningún delimitador ni de principio ni de fin de cadena. // creamos un flujo de entrada DataInputStream dis = new DataInputStream( is ).writeUTF(cadena3). writeBytes() .1. La conclusión importante que debemos extraer de estos tres últimos métodos es que sólo el último nos permite recuperar la cadena con facilidad. Este formato incluye información sobre la longitud exacta de la cadena.readInt(). y lo escriben en el OutputStream subyacente usando diferentes formatos. sobre cualquier plataforma y sistema operativo. La especificación de esta clase garantiza que cualquier archivo escrito por un DataOutputStream . String cadena2 = "Me voy a descomponer en una cadena de texto de chars individuales". sin tener necesidad de preocuparse de que si las máquinas son "little-endian" o "big-endian". escribe n bytes. La clase DataInputStream está diseñada para leer datos generados por un objeto DataOutputStream . Si la cadena consta de n letras. es imposible saber el número de bytes o de valores char que debemos leer. . descubriremos algunos métodos de los que aún no hemos hablado.. un float y un double en un flujo de salida): InputStream is = . • writeBytes() descompone la cadena de texto en bytes individuales (obtiene su código ASCII) y los escribe en el flujo de salida. Supongamos que estamos intentando leer los datos escritos por el programa de ejemplo anterior (donde escribíamos un int. Estos tres métodos reciben como parámetros un objeto de tipo String . • writeChars() descompone la cadena de texto en chars individuales (obtiene su código Unicode) y los escribe en el flujo de salida. double z.

. podemos tener un objeto capaz de leer un archivo MPEG (video comprimido) y mostrarlo posteriormente en pantalla. Por ejemplo. dis.close(). n++ ) otroArrayMas[ s ] = dis. Cualquier objeto que leyera datos de este flujo. DataInputStream. pero queremos que lea los datos desde una array de bytes que tenemos en memoria. en realidad estaría obteniendo los datos secuencialmente del array. por ejemplo: Profesor: Carlos A. Ruiz De La Cruz Melo 19 . La clase que nos permite hacer este es DataArrayInputstream . sería crear un flujo que extrajera sus datos directamente desde nuestro array en memoria.readFully( byte[] ) .readFloat(). ya que sabemos que las cadenas cadena1 y cadena2 tienen una longitud de 65 letras exactamente. Es inmediato leer la cadena escrita en formato UTF.readUTF(). String ultimaCadena = dis.readDouble(). En una situación normal. // Aplicamos el truco InputStream is =. leer las otras dos cadenas nos va a costar más trabajo. is. n < tam . Esta clase tiene un constructor al que se le pasa como parámetro la matriz de bytes de la que debe leer. más elegante y más eficiente que la anterior. int tam = 65. ya que la longitud // del String está indicada en el propio archivo. // Ahora tenemos que leer un montón de caracteres char de (16 bits) // que forman el siguiente String escrito.. Es fácil apreciar las ventajas de usar los métodos writeUTF() y readUTF() . Supongamos que ese objeto está diseñado para leer los datos desde un InputStream . juntarlos de forma adecuada y construir la cadena resultante.close().read(byte[]) . Otra forma.readChar(). //creamos el flujo de entrada DataInputStream dis = new DataInputStream( is ). cuyo contenido hemos generado de alguna forma. ¿Qué pasa si deseamos leer las cadenas de texto que hemos escrito?. con la única diferencia de que no retorna hasta que hayan sido leídos exactamente el número de bytes que caben en la matriz. puede que no tengamos esta información. En este caso usaremos un truco . y hacer que nuestro objeto reproductor de MPEG leyera el contenido. ya que debemos leer los bytes o los chars individuales.readFully(miNuevaArray). // Solo resta leer el String en formato UTF-8 // Unicamente con llamar a readUTF(). Entrada y Salida en memoria Existen ocasiones en que nos puede interesar acceder a cierta información en memoria como si estuviéramos leyendo desde un flujo de datos. En cambio.0=. /* Este método es nuevo */ String cadenaConvertida = new String(miNuevaArray.y = dis. En el ejemplo anterior hemos usado un método nuevo. z = dis. dis. Una forma de resolver el problema sería escribir el array de bytes en un archivo. String otraCadenaconvertida = new String( otroArrayMas ).. byte miNuevoArray[] = new byte [ tam ]. que es básicamente equivalente a InputStream. // Hay que hacer un bucle para ir leyendo los caracteres uno por uno char otroArrayMas[] = new char[tam]: for( int n = 0 .

baos write(dato). sabiendo que estos datos se almacenan internamente en una matriz de bytes. condicion = ….9999 su calificación será “Bueno”. Veamos el siguiente fragmento de código de ejemplo: ByteArrayOutputStream baos = new ByteArrayOutputStream(): boolean condicion = false. Esta matriz crece dinámicamente a medida que escribimos datos en ella.toByteArray(). podemos acceder a la matriz de bytes mediante el método toByteArray(). Id Apellidos 1 Davolio Nombre Nancy Cargo Representante de ventas Tratami ento Srta.. Una vez escritos los datos.00 Word 8.19 Excel 9. La clase ByteArrayPutputStream es otra del mismo tipo muy útil. Los datos deben leerse de un archivo de entrada: “entrada. Ruiz De La Cruz Melo 20 . El área que esta en gris debe ser calculada con fórmulas.1. ya que por medio de esta podemos escribir datos en un flujo. 2. n < tam .out.11 Ejemplo de DataInputStream y DataOutputStream Vamos a resolver el siguiente programa utilizando las clases DataInputStream y DataOutputStream .999 su calificación será “Burro no aprobado”. Si el alumno saca 10 la calificación será “Sobresaliente”. byte[] buffer = new byte[ tam ].read() ) != -1 ) .println( " Se ha leído el valor: " + c ). n++ ) buffer[n] = n. } byte[] bufferSalida = baos.999 su calificación será “De pansazo” y si obtiene entre 0 a 6. … int c: while( ( c = bais.. Windows 8. /*Mientras leamos algo de buffer*/ System.txt”. Una vez ejecutado el código anterior obtenemos una matriz de bytes con todos los datos que se han ido introduciendo en la iteración del bucle.int tam = 40. for( int n = 0 . si obtiene entre 8 a 8. si obtiene de 7 a 7. si obtiene entre 9 a 9. while( condicion ) { int dato = ….04 Promedio Calificació n Profesor: Carlos A. 25% para la de Word y 25% para la de Excel. Un profesor de computación lleva las calificaciones de sus alumnos en una libreta y desea calcular las calificaciones de estos. ByteArrayInputStream bais = new ByteArrayInputStream( buffer ). que nos devuelve una copia de la matriz original. El promedio total para cada alumno será : 50% para la calificación de Windows.999 su calificación será “Muy Bien”.txt” y los resultados en un archivo de salida: “salida.

00 8.00 8.double media) calcula la varianza.00 5. i++) { 19. * de las clases DataInputStream y DataOutputStream 4. * para enseñarte a usar datos con formato en archivos. Así.00 9. y finalmente el método varianzaPromedios(Alumno v[].00 1. El método maxYminCalif(Alumno w[]) hace el trabajo de obtener que alumnos obtuvieron la máxima y mínima calificación y los imprime. System.00 8.00 Gerente de ventas Sr. el método estático de clase PromediosGenerales(Alumno z[]) devuelve el promedio de cada alumno y recibe el arreglo de la clase Alumno .out. 1. Máxima Calificación ALumno Promedio Mínima Calificación Alumno Promedio Varianza de los promedios Solución: La clase EvaluadorArchivos tiene el método main() que arranca todo el proceso.00 8.println(""+x[i]. Coordinador ventas interno Srta. 12. 14.out. y en él están los nombres de los archivos entrada. 8.50 6. 5.java 8.91 8. 15.txt para el manejo de los datos.14 7. * Archivo: EvaluadorArchivos2. if( band ==1) 16. Después se invocan a algunos métodos estáticos de clase para el cálculo de los datos estadísticos. Representante de ventas Representante de ventas Sr. System. i< x. Información general de rendimiento del grupo de estudiantes. Sra. Representante de ventas Srta.00 8. * Programa de java que ejemplifica el uso 3. Srta.00 8.00 8. Sr.00 9.txt para asignárselos al arreglo p de la clase Alumnos en el bucle while de la línea 116 a la 119. static void imprime( Alumno x[] ) { 13. 17.00 10. González Bustamante 6. for (int i=0. También se leen todos los datos del archivo entrada. * @version 1. /** 2.00 8. public class EvaluadorArchivos2 { 11.2 Fuller 3 Leverling 4 Peacock 5 Buchanan 6 Suyama 7 King 8 Callahan 9 Dodsworth Andrew Janet Margaret Steven Michael Robert Laura Anne Vicepresidente comercial Representante de ventas Representante de ventas Dr.57 8.00 8.00 8. * @autor Oscar A.00 5.txt y salida. Ruiz De La Cruz Melo 21 .0 7. en base a la media que se le envia como argumento.println("Id\tNombre\tApellidos\tCargo\tTrato\tWindows\tWord\tExcel\tPromedio\tCalificacion"). final int band=1.length.00 8.id + "\t" + Profesor: Carlos A.32 10. */ 9. 10.00 8. 18.

println(""). promWord=0. 55. 37. 44. double promWindows=0.0. System. Escribe. 47.out. x[i].out. 63. 62.println(). 66. 40."=")."=").ponRaya(100. estrellita= 0.0. 28. 65. 35. 22. 69. 49. Escribe. 33.getExamen(3). 29.cargo + "\t" + + "\t" + + "\t" + + "\t" + + "\t" + + "\t" + + "\t" + x[i].println(). 32. 27.getExamen(1).getExamen(3) x[i]. 23."-"). } } static double PromediosGenerales(Alumno z[]) { double sumaWindows=0. sumaWord=0. 68. Escribe. System. 60. minima=0. maxima = w[0]. promWord = sumaWord / z. 56. 61. promGrupo= 0. 59. System.length. 50. } public static void maxYminCalif(Alumno w[]) { double maxima=0.out.println("Información general del rendimiento del grupo de estudiantes").getExamen(2). System.0.length. 42. 38. sumaGrupo = sumaGrupo + z[i]. sumaExcel = sumaExcel + z[i]. return promGrupo. 39.0. i++) { sumaWindows = sumaWindows + z[i].println("\tPromedio de Windows:"+ promWindows + "\n" + "\tPromedio de Word: " + promWord "\tPromedio de Excel: " + promExcel "\tPromedio del Grupo: " + promGrupo). 43.nombre x[i].0.out.ponRaya(100. int burro= 0.20.getPromedio(). + "\n" + + "\n" + Profesor: Carlos A. 41.0. 64. sumaGrupo= 0.0. promExcel = sumaExcel / z.apellidos x[i]. 21. 45. 25. 58. 34. sumaExcel= 0.length.getCalificacion() + "\t" ).getPromedio(). 46. 67. 57. promExcel= 0.length. sumaWord = sumaWord + z[i]. } promWindows = sumaWindows / z. 51.getPromedio() x[i]. 52.0. 26. i< z.getExamen(2) x[i]. Ruiz De La Cruz Melo 22 . 36. 53. promGrupo = sumaGrupo / z. 31.out.length. 24. 30. for (int i=0. 54.0. System. 48.ponRaya(100.getExamen(1) x[i].0.

println("\tMinima Calificacion:" "\n\tPromedio:" + minima). for(int i=1.out. Ruiz De La Cruz Melo 23 .70. minima = w[0]. 78. 112.nombre + " " + w[burro]. 114.out.getPromedio(). 93. 118.2). varianza = Math. 87.out. // Crea un flujo de entrada ArchivoEnt archivo_secu = new ArchivoEnt(archient). 104. 72. 98.pow(media . 117. 111. i++){ if ( maxima < w[i]. 79. 71. 115. Escribe. 75. 101.0. 89. 86. estrellita = i. 84. } public static void main( String args[] ) { String[] archivos = { new String("salida. 97. String archisal = archivos[0].nombre + " " + w[estrellita].length.txt") }. } if ( minima > w[i]. 119.ponRaya(40. 82."-"). 85. 99. varianza = 0. burro = i. double lamedia = 0. 95. 88. i< w.txt"). for (int i=0. } ds = ds/ v.0.getPromedio(). new String("entrada.double media) { double ds=0. 92. while (i<p. 107. 90. 76. 108. 110. 96. 113. 83.getPromedio() ) {minima = w[i].sqrt(ds). 116.getPromedio() ) {maxima = w[i]. 94.println("\tVarianza de los promedios:" + varianza). 106. 77. Alumno p[] = new Alumno[9]. String archient = archivos[1]. } public static void varianzaPromedios(Alumno v[]. i++) { ds = ds + Math. System. System.ponRaya(40. i++.length) { p[i] = archivo_secu.v[i]. 80. 73. 105. i < v.length.0.leer().getPromedio().apellidos + + "\n\tAlumno:" + w[estrellita].println(). 74. + "\n\tAlumno:" + w[burro]. 100. 91.getPromedio(). 103. System.length. System.println("\tMaxima Calificacion:" "\n\tPromedio:" + maxima)."-"). 102. } Profesor: Carlos A. } } Escribe.out.apellidos + // Mientras no se encuentre el final del archivo sigue leyendo int i=0. 109. 81.

archivo_secu.120.00.". 148."Vicepresidente comercial".0 8.".0 .length.10."King". lamedia=PromediosGenerales(p). Ruiz De La Cruz Melo 24 . 149."Sra.". 133.0 8.0 7. } archi_secu."Robert". 130.". 138. 126.8. p[7] = new Alumno(8."Laura"."Sr. p[3] = new Alumno(4.14.04).00 .32 8."Sr. 124.00. i<p.705 Muy Bien ---------------------------------------------------------------------------------------------------8 Callahan Laura Cordinador ventas interno 8. p[2] = new Alumno(3.00.0 8.8. 144.91 8. 143.lamedia). 147. 125.8.0 10.875 Muy Bien ---------------------------------------------------------------------------------------------------- Profesor: Carlos A.57 5.0 8."Srta.16 Muy Bien ---------------------------------------------------------------------------------------------------5 Buchanan Steven Gerente de Ventas 10. 137.8."Sr.00. 134.32.0 Muy Bien ---------------------------------------------------------------------------------------------------4 Peacock Margaret Representante de Ventas 8. 132.00.00). p[4] = new Alumno(5.00. for ( int i=0.00)."Davolio".8.". 121.00). */ } // fin del main() } // fin de EvaluadorArchivos2 Al ejecutar este programa con el comando java EvaluadorArchivos2 da los siguientes resultados: Id Nombre Apellidos Cargo Trato Windows Word Excel Promedio Calificacion 1 Davolio Nancy Representante de Ventas 8.14 5.00.0 8.8. 145."Callahan".0 7.50.5 Muy Bien ---------------------------------------------------------------------------------------------------6 Suyama Michael Representante de Ventas 8.0 8.9."Michael".00."Margaret".8.5."Representante de Ventas"."Representante de Ventas".0 8."Peacock".00. 142.6775 Muy Bien ---------------------------------------------------------------------------------------------------9 Dodsworth Anne Representante de ventas 8.insertar(p[i]).00.1.0 9.25 Muy Bien ---------------------------------------------------------------------------------------------------7 King Robert Representante de Ventas 8.19 7.9.8. p[5] = new Alumno(6."Representante de Ventas". 129. varianzaPromedios(p.57). 141.10.00)."Cordinador ventas interno".0 6.".".8. ArchivoSal archi_secu = new ArchivoSal(archisal).0 8."Janet". 123.". p[1] = new Alumno(2."Srta. 139.7.9.8. //parte dedicada a crear los datos y guardarlos en un archivo de salida // hay que quitarle los comentarios si no existe el archivo con formato de entrada /* p[0] = new Alumno(1.0 7."Dodsworth".0).8. 122.00."Suyama".6."Gerente de Ventas". 140.8.8.8."Leverling". 135. p[6] = new Alumno(7.0 9.0 8."Representante de ventas".0 9."Andrew".8. 150."Srta.cerrar()."Representante de Ventas". 146. imprime(p)."Srta."Anne". p[8] = new Alumno(9.cerrar()."Representante de Ventas". i++) { archi_secu.0 5.75 Muy Bien ---------------------------------------------------------------------------------------------------3 Leverling Janet Representante de Ventas 8.00)."Dr.19."Nancy".5 8. 131. 136. maxYminCalif(p).5."Fuller".91."Buchanan".".0 7.807499999999999 Muy Bien ---------------------------------------------------------------------------------------------------2 Fuller Andrew Vicepresidente comercial 8. 127."Steven".0 1.00).8.04 7.8. 128.

1. González Bustamante 7. public class ArchivoEnt { 14. readUTF() . private File fichero.java 9. * Archivo: ArchivoEnt.=============================================================== ===================================== Información general del rendimiento del grupo de estudiantes =============================================================== ===================================== Promedio de Windows:8.5 Minima Calificacion: Alumno:Callahan Laura Promedio:5. 11. /** 2. La ubicación de ese archivo es especificada por la variable String ruta en la línea 14 y puede ser cambiada. 19. * @autor Oscar A. boolean fin. 6. */ 10.734444444444445 Promedio del Grupo: 7. * para usar datos con formato en archivos. 20. * Clase publica ArchivoEnt y que es necesaria para el 3.cloose() lo cual es importante para evitar un problema con el administrador de archivos del sistema operativo.catch por si hay un error de tipo IOException . ArchivoEnt(String nombarchent) { Profesor: Carlos A.6775 ---------------------------------------Varianza de los promedios:0. Ruiz De La Cruz Melo 25 . y readDouble() regresando un objeto de la clase Alumno . * utilizar las clases DataInputStream y DataOutputStream 5. private DataInputStream ent. 12. * programa EvaluadorArchivos2. 16. El método leer() de la línea 36 a la 56 hace el trabajo de leer un registro del archivo con datos con formato y emplea los métodos de la clase DataInputStream .io. El constructor ArchivoEnt(String nombarchent) crea el flujo al archivo de entrada y crea un objeto de la clase DataInputStream para leer los datos con formato y todo se hace en un try . readInt() . 15. 21.*. 18. static String ruta = "C:\\j2sdk141\\ejemplos\\E-S\\". import java.8583333333333325 ---------------------------------------Maxima Calificacion: Alumno:Buchanan Steven Promedio:9. 13. el método cerrar() de la línea 58 a la 65 cierra el flujo de entrada que abrimos con el método ent.35888888888889 Promedio de Word: 6.txt . private FileInputStream f. * @version 1.981111111111111 Promedio de Excel: 7.9811380863285476 La clase ArchivoEnt hace el trabajo de leer los datos del archivo entrada.java y que enseña a 4. 17.0 8.

err. 24. fichero = new File(ruta+nombarchent). } } } // de la clase ArchivoEnt La clase ArchivoSal hace el trabajo de escribir los datos del archivo salida. 35.err. 27. 25.err. ioe. }catch(EOFException eof) { fin=true.readDouble(). return reg. 37. 41.getMessage()). 53. 64.readUTF(). 38. 65. 36. 61.close(). 33. ioe. ent.println("Se ha producido un Error: " + ioe. 54. Profesor: Carlos A. } public void cerrar(){ try { ent. 51. try { fin = false. 32. 34. 40. 43. 66. 63.printStackTrace(). ent. } } //Retorna si nos encontramos al final del archivo public boolean eof() { return fin. 30. 23. ent.readUTF().readDouble().readUTF().} catch(IOException ioe) { System.printStackTrace(). 44. 48. 58. 52.println("Se ha producido un Error: " + ioe. 26. try{ //lee un registro de Alumno del archivo reg= new Alumno(ent.txt . } public Alumno leer() { Alumno reg= null. Ruiz De La Cruz Melo 26 . 39. 56.getMessage()). } catch(IOException ioe) { System. 29.readDouble() ). 67. 47. 45. ent.readInt(). 46. 55. 62. } catch(IOException ioe) { System.println("Se ha producido un Error: " + ioe. } return reg.22. 59. ent.readUTF().getMessage()). ent. 42. ioe.printStackTrace(). 28. ent = new DataInputStream( f ). ent. 60. 49. f = new FileInputStream(fichero). 57. La ubicación de ese archivo es especificada por la variable String ruta en la línea 14 y puede ser cambiada. 31. 50.

sal. { 35. private DataOutputStream sal. 12.writeUTF(reg. 18. } 32.writeUTF(reg. static String ruta = "C:\\j2sdk141\\ejemplos\\E-S\\". * programa EvaluadorArchivos2. 17. 38.io. 28. f = new FileOutputStream(fichero).getTratamiento()). writeUTF() . } 30. public void insertar(Alumno reg ) 34. 33. sal. sal = new DataOutputStream( f ). 29.flush() lo cual es importante para evitar un problema con el sistema operativo. Profesor: Carlos A. el método cerrar() de la línea 51 a la 58 cierra el flujo de salida que creamos con el método sal. 22. fichero = new File(ruta+nombarchsal). 26. * Archivo: ArchivoSal. 37. try { 23. 39.printStackTrace(). 11. * @autor Oscar A. private FileOutputStream f. try { 36. 6. /** 2.getCargo()). González Bustamante 7. sal. 1. import java.*. sal.java 9. 24. adicionalmente a esto primero liberamos el flujo de salida con el método sal. } catch(IOException ioe) { 27.writeInt(reg.println("Se ha producido un Error: " + ioe.getNombre()).writeUTF(reg. System. Ruiz De La Cruz Melo 27 . 16. * Clase publica ArchivoSal y que es necesaria para el 3.getApellidos()). sal.err. ioe. y writeDouble() .writeUTF(reg.El constructor ArchivoSal(String nombarchsal) crea el flujo al archivo de salida y crea un objeto de la clase DataOutputStream para escribir los datos con formato y todo se hace en un try . 13. public class ArchivoSal { 14.java y que enseña a 4.getMessage()).cloose() . 40. 15.0 8. * @version 1. writeInt() . ArchivoSal(String nombarchsal) { 21.getId()). * para usar datos con formato en archivos. 20. 25. */ 10. El método insertar(Alumno reg) de la línea 33 a la 48 hace el trabajo de escribir un registro de la clase Alumno con formato y emplea los métodos de la clase DataOutputStream . 31.catch por si hay un error de tipo IOException . private File fichero. * utilizar las clases DataInputStream y DataOutputStream 5. 19.

17. 45. apellidos=null. 47.printStackTrace(). protected int id.println("Se ha producido un Error: " + ioe. 24.41. protected String nombre. } } } // fin de la clase de ArchivoSal La clase Persona establece los campos y métodos accesores get y modificadores o mutadores set para obtener o cambiar los valores de las variables miembro de la clase. 60. * para usar datos con formato en archivos. * @autor Oscar A. sal. } catch(IOException ioe) { System.printStackTrace(). * Clase publica Persona que es necesaria para el 3. 59. 1. 43. protected String cargo.writeDouble(reg. 55.java 9. 46.getMessage()). ioe. cargo=null. sal. id=-1. 57. 22.close(). */ 10.err.getExamen(2)). 23. Ruiz De La Cruz Melo 28 . 48. 11. nombre=null. } catch(IOException ioe) { System. 18.flush(). * Archivo: Persona. protected String apellidos. 16. /** 2. 50. 12. 44. 19. 56. ioe. } } public void cerrar(){ try { sal. 58.getExamen(3)).writeDouble(reg. protected String tratamiento. 21. González Bustamante 7. 42. Esta clase heredará todos estos miembros a su subclase Alumno y que son utilizados a lo largo del programa ejemplo.getExamen(1)). 54.getMessage()). sal. Persona() { 20. tratamiento=null. * utilizar las clases DataInputStream y DataOutputStream 5.println("Se ha producido un Error: " + ioe. * @version 1. 14. 53. 52. 49. 15.0 8. 6. } Profesor: Carlos A.writeDouble(reg.java y que enseña a 4. * programa EvaluadorArchivos2.err. public class Persona { 13. sal. 51. 25.

public String getTratamiento() { return tratamiento.} 39. String nombre. 1. 27.} 37. } 46. public void setNombre(String nuevonombre) { nombre = nuevonombre. 35. 47. public String getNombre() { return nombre. public void setApellidos(String nuevoapellidos) { apellidos = nuevoapellidos. this. this. En esta clase se manejan las calificaciones de los exámenes de cada alumno con las variables de tipo doble exa1.26. 17. Implementa la interface ConstantesUtiles para manejar un arreglo de Strings para asignar la calificación. * Clase publica Alumno y que es subclase 3. public void setTratamiento(String nuevotratamiento) { tratamiento = nuevotratamiento. exa3.apellidos = apellidos. 33. * de la clase Persona y que es necesaria para el 4.} 40. 29. 7. exa2 y exa3. String cargo. String apellidos. String tratamiento) { 28.tratamiento = tratamiento. Persona (int id. private double exa1. 12. y los métodos setCalificacion() y getCalificación() para la obtención de la calificación en base al promedio. 32. Tiene los métodos getPromedio() y setPromedio() que hacen las operaciones del cálculo del promedio ponderado. } 34. public class Alumno extends Persona implements ConstantesUtiles { 14. public void setId(int nuevoid) { id = nuevoid. exa2. } 45. * utilizar las clases DataInputStream y DataOutputStream 6. public String getApellidos() { return apellidos.} 44. // metodos accesores y modificadores 36. } 42. this. */ 11. /** 2. } // fin de Persona La clase Alumno que es hija de la clase Persona . private String calificacion. } 43.java y que enseña a 5. public int getId() { return id. 13. la media o promedio con la variable de tipo doble promedio y la calificación con la variable String calificacion .0 9. 15. this. Ruiz De La Cruz Melo 29 . this.nombre = nombre. González Bustamante 8. * @autor Oscar A. public void setCargo(String nuevocargo) { cargo = nuevocargo. 31. public String getCargo() { return cargo. } 38. 30.java 10. 16. Alumno() { Profesor: Carlos A. * Archivo: Alumno. * programa EvaluadorArchivos2. * para usar datos con formato en archivos. 18. } 41. private double promedio.id = id. * @version 1.cargo = cargo.

double exa2. String cargo. else if ( promedio <= 8. 56. Profesor: Carlos A. 28. 63. 29. 27. } public void setCalificacion() { if ( promedio== 10. 66. double exa1. 25.9999 && promedio >= 8. exa2=-1. 51. 30. promedio=-1.apellidos. return promedio. 35. this. Ruiz De La Cruz Melo 30 . else if ( promedio <= 6. } Alumno(int id.nombre. super(-1. 24. exa3=-1.0) calificacion = calificativo[1]. 47. } public void setExamen(double examen. 55. 34.25. else if ( noexa == 2) return exa2. 31. 62. String tratamiento. 68. calificacion=null. 22.999 && promedio >= 0.999 && promedio >= 9. 40. //excel } public double getExamen(int noexa) { if ( noexa == 1 ) return exa1. 58.exa3 = exa3. 44. String nombre.0 ) calificacion = calificativo[0] . else if ( promedio <= 7. 38. 43.cargo. 52. 20. 33. double exa3) { super(id.null. 54. 21. else if ( promedio <= 9. 59. else return -1. 48. 45. 50.exa2 = exa2. 60. 37. this. } public void setPromedio() { promedio = exa1*0.19. int noexa) { if ( noexa == 1 ) exa1 = examen. 23. 53. 64. } public double getPromedio() { setPromedio().5 + exa2*0. 42. String apellidos. 61. 32.exa1 = exa1. 67.null.25 + exa3*0. 49. 46.0) calificacion = calificativo[1].0) calificacion = calificativo[1]. //windows if ( noexa == 2) exa2 = examen.null. this. 39.null).999 && promedio >= 7. 65. //word if ( noexa == 3 ) exa3 = examen. 41.tratamiento).0) calificacion = calificativo[1]. 26. exa1=-1. else if ( noexa == 3 ) return exa3. 36. 57.

75. String simb) { 12. * Carlos A. public String getCalificacion() { 74. 6. 72. * @version 1. setCalificacion(). public interface ConstantesUtiles { 12. } 71. i <= lim. 1.java y que enseña a * utilizar las clases DataInputStream y DataOutputStream 5. 11. 73. 3. } 77. 76. i++) 31 . 1.0 8. else calificacion = null. 4.java De La Cruz Melo 8.java 9. public static void ponRaya(int lim.69. /** * Clase publica Escribe y que es necesaria para el * programa EvaluadorArchivos2. 4. public static String calificativo[] = { Finalmente la clase Escribe tiene el método ponRaya( int lim. Ruiz 9. String simb ) el cual se emplea para escribir líneas de símbolos para separar los resultados de la salida y su uso es utilitario. * para usar datos con formato en archivos. * @autor Oscar A. for (int i = 1. González Bustamante 7. 78. 70. 2.java y que enseña a * utilizar las clases DataInputStream y DataOutputStream 5. * para usar datos con formato en archivos. 2. class Escribe { 11. González Bustamante 7. 3. * @version 1. 13. 6. return calificacion. } // fin de Alumno La interface ConstantesUtiles solo sirve para declarar un arreglo constante de objetos String para cada una de las calificaciones y se utiliza en la clase Alumno . * @autor Oscar A. */ 10. */ 10. * Archivo: ConstantesUtiles. /** * Interface publica con constantes que necesita * el programa EvaluadorArchivos2.0 Profesor: Archivo: Escribe.

PROCEDIMIENTO El procedimiento consiste en dos pasos • • Diagrama de clase Implementación en java Ejemplo 1 : archivo de texto import java.util.print(mensaje). BufferedReader b=new BufferedReader(new InputStreamReader(System. 3. ArchiEnt y ArchiSal deberían haber estado en un paquete de clases y luego importadas en la clase EvaluadorArchivos2 pero esto se deja como ejercicio al lector. try{ FileWriter fw = new FileWriter ("text. PrintWriter salArch = new PrintWriter (bw).println("No se puede leer").dat". import java. return nombre.out. BufferedWriter bw = new BufferedWriter (fw). import java. } Profesor: Carlos A.*. incluso las clases Alumno . Ruiz De La Cruz Melo 32 .lang.Tanto la interface ConstantesUtiles y la clase Escribe pudieron haber estado en un paquete y luego importadas.*. Persona . } public void escritura(String nomb){ String arch = "prueba.out).*.txt". class TEXTO{ PrintStream p=new PrintStream(System.in)). REQUERIMIENTOS O MATERIAL Y EQUIPO • • Software: Java 1 Diskete 4.true). try{ nombre=b. String dato(String mensaje){ System.readLine( ). String nombre. } catch(IOException ioe){ p.io.

println("No se puede leer"). import java.in)).IOException ioex){ } } public void mostrar(){ try { FileReader fr=new FileReader("text.io. try{ nombre=b.readLine( ).print(mensaje). entrada.io.FileNotFoundException fnfex){ } catch(java.dato("Ingrese algo al archivo > ")).io.*.IOException ioex){ } Profesor: Carlos A. String nombre. fun.true))). } public void escritura(double d1){ try{ DataOutputStream dos= new DataOutputStream( new BufferedOutputStream(new FileOutputStream("prueba. BufferedReader b=new BufferedReader(new InputStreamReader(System.util. archivo binario import java.close(). } catch(java.io. dos. } catch(java. BufferedReader entrada=new BufferedReader(fr).io. fun. import java.out.println(nomb).close().*.*.txt"). public String dato(String mensaje){ System.out. class BINARIO{ PrintStream p=new PrintStream(System. Ruiz De La Cruz Melo 33 .println("Salida del archivo : "+s).out).lang.mostrar().writeDouble(d1).salArch. } catch(IOException ioe){ p. } } Ejemplo 2.dat". salArch. } return nombre.escritura(fun. } catch(java.readLine( ) )!=null){ System. while((s=entrada. dos.IOException ioex){ } } } public static void main(String arg[ ]){ TEXTO fun= new TEXTO(). String s.close().

io. 15).dat"))). ObjectInputStream ois = new ObjectInputStream(new FileInputStream("serial")).escritura(Float.out.} public void mostrar(){ // PERMITE MOSTRAR EL VALOR REAL EN EL ARCHIVO String s.getMessage()). ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("serial")). try { DataInputStream disco= new DataInputStream(new BufferedInputStream(new FileInputStream("prueba. while(f.io.println("Objeto 2: " + obj2).getMessage( )).out.exists( ) ){ d2=disco.FileNotFoundException fnfex){ } catch(java.out. } catch (Exception e) {System.dat").exit(0).readDouble( ).parseFloat(fun.close().System.exit(0).out.readObject( ).close( ). obj2 = (MiClase)ois. } catch(Exception e) {System. } catch(java.close( ). System.escritura(Float.io. oos. fun. ois.mostrar().IOException ioex){ } } public static void main(String arg[ ]){ BINARIO fun= new BINARIO( ).dato("Ingrese un real > "))).System. System. } disco. System.println(d2). oos.} } } class MiClase implements Serializable { Profesor: Carlos A.println("Objeto 1: " + obj1). public class serial { public static void main(String args[ ]) { //Serializamos el objeto try { MiClase obj1 = new MiClase("String".} //Deserialización del objeto try { MiClase obj2. fun. double d2. fun. Un objeto guardado mediante serialización import java.println(e. } } Ejemplo 3. File f= new File("prueba.println("si"+e.*.parseFloat(fun.out.dato("Ingrese un real > "))). Ruiz De La Cruz Melo 34 .writeObject(obj1).

readObject( ))!=null){ System.close(). } ois. public MiClase(String s.writeObject(obj1).println(obj2. this. Varios objetos guardados mediante serializacion import java. i<4.print(mensaje). int i) { this.in)). } oos.Rc( )+ " "+obj2.Rn( )). i++){ ALUMNO obj1=new ALUMNO(leer("codigo : ").readLine( ).s = s. } void E( ){ try{ ObjectOutputStream oos= new ObjectOutputStream(new FileOutputStream("registro")).io. } catch(Exception ioe){ } return nombre.i = i.out. s. ObjectInputStream ois=new ObjectInputStream(new FileInputStream("registro")). s. class serializacion { BufferedReader b=new BufferedReader(new InputStreamReader(System. oos. } public String toString() { return "s=" + s + ". Ruiz De La Cruz Melo 35 . while((obj2=(ALUMNO)ois.out. String nombre.M( ).E( ).String s.close( ). try{ nombre=b. } catch(Exception op){ } } public static void main(String args[ ]){ serializacion s=new serializacion( ). for(int i=0.*. String leer(String mensaje){ System. int i. Profesor: Carlos A. } } Ejemplo 4. } catch(Exception e){ } } void M( ){ try { ALUMNO obj2. i=" + i.leer("nombre : ")).

void E( ). String n. BufferedReader teclado = new BufferedReader(new 5. 2. String n. void B( ). } Ejemplo 5. this.String n){ public String Rn( ){ return n. modificar datos según la clave. Programa que realiza varias operaciones sobre un archivo (ingresar datos.io.in)). } } this.n=n.*. 3. import java. 1. 7. boolean M( ). Int edad. } public String Rc( ){ return c.lang. eliminar según el código o clave. void O( ). Int Clave.*. ordenar por clave y mostrar todos los datos del archivo ) A continuación un ejemplo de los datos que se puede ingresar al archivo CLAVE 10 20 30 33 Diagrama de clases NOMBRE carlos Maria Juan Elena EDAD 35 20 40 60 PERSONA String n. 6. String leer(String m).} } class ALUMNO implements Serializable { String c. public ALUMNO(String c. import java. int clave=0. class ARCH { 4. Ruiz De La Cruz Melo 36 . InputStreamReader(System.c=c. Profesor: Carlos A. void L( ).

Ruiz De La Cruz Melo . 53.out. } 39.length( ) ).8. 24. RandomAccessFile archivo=new RandomAccessFile(arch.writeChars(nombre). 54. 33. i <25. 52. 47. archivo. if (nombre.println("Error al escribir"). return n.parseInt(leer("dame clave a buscar")).writeInt(edad). 19. File arch=new File("archivo1. i++) nombre=nombre+" ". 31.length( ).println("Arch. }. } 40."rw"). 9.print(m+" : "). 22. if (archivo. 28. long tregistro=58. 37 Profesor: Carlos A. System.out. long cregistros=0. No existe")."rw").length( ) < 25){ 25. archivo. 50. 26. 51. archivo. edad = Integer. clave=archivo. 43. 55. 23. String nombre="".length( )/ tregistro.dat"). 10. 35. catch (IOException e) { System.close( ). 21. int c = Integer. } 27. 48. archivo. 49. i <25. if (nombre. 56. else{ nombre=nombre.out. catch(FileNotFoundException f) { System. }.25). } 14. 46. cregistros=archivo. } 17.parseInt(leer("dame edad")).length() < 25){ for(int i=nombre. 13. while(n<cregistros){ archivo. nombre=leer("dame nombre"). 32. }. for(int i=nombre. } 38. 29. clave = Integer. 34. 11. } 37.seek(n*58). i++) nombre=nombre+" ".writeInt(clave).seek( archivo. 42.readInt(). } else{ nombre=nombre. try { 20.25). catch(Exception e){ } 15. archivo.length( )!= 0){ 30. public String leer(String m){ 12. boolean M( ){ String nombre="". 45. int edad=0. void E( ){ 18. 36.dat").parseInt(leer("dame clave")). 16. try{ File arch=new File("archivo1.substring(0. 44.substring(0.readLine( ). 41. RandomAccessFile archivo=new RandomAccessFile(arch. try{ n=teclado. int n=0.length(). if(clave == c){ nombre=leer("dame nombre").

} 70. c2=archivo. archivo. Ruiz De La Cruz Melo 38 . archivo. edad = Integer. return true. int c2. c1=archivo. 60. String n2. 63. archivo. c1=archivo. Profesor: Carlos A. do{ 86. }. n=n+1. 102. 96. RandomAccessFile archivo=new RandomAccessFile(arch. for(int i = 0. 98. int c1.parseInt(leer("dame edad")).out.close(). if(c1<c2){ 93. archivo. 58. 105. archivo.readChar( ). String n1. archivo. }. } 67. 81.out.seek((r+1)*58).seek((r+1)*58). 92. 91. archivo. 66. 62. 76.readChar( ). salir=false.57.readInt( ).close(). 68. 103. } 71. 77. 104. 59. catch(FileNotFoundException f) { System.length( ) / tregistro. 87. catch (IOException e) { System. 89.readInt(). return false. 94. c1=0. 95. 97.seek(r*58). r < (cregistros-1). boolean salir. 78.println("Arch. 101. 100. e1=archivo.seek(n*58). 75. no existe"). } 65.writeInt(edad). 72.readInt( ). try { 82."rw"). i < 25. n1="". 83. n2="". 99. 84. 79. 80. cregistros=archivo. i < 25. } 73. c2=archivo.println("Error al escribir").writeChars(nombre). int e1. e1=0. 64.writeInt(clave). void O( ){ 74. c2=0. archivo. 61. ++i){ n2 += archivo.dat"). 90. 85. int e2.readInt(). for(int i = 0.readInt(). } 69. File arch=new File("archivo1. r++){ 88. for (int r=0. archivo. archivo. ++i){ n1 += archivo.seek(r*58). e2=0.

. } 121. 133.dat"). i < 25.){ k++.readChar( ). for(int i = 0.} n=n+1. archivo. 146. RandomAccessFile archivo=new RandomAccessFile(arch. 120. archivo. 134.writeInt(e1).seek((r+1)*58). e2=archivo. while(n<cregistros){ archivo.writeChars(n2). try{ File arch=new File("archivo1.seek(n*58). archivo. c1=archivo.writeInt(e2). 107. void B( ){ int c1. archivo.readInt(). 137. archivo. 139. archivo. 141. 116. 127. 148.println("Arch. archivo.writeInt(c1).}. archivo. if(cond){ for(. 135. 149. if(clave == c){ cond=true. archivo. 113.seek(k*58). 153. } 117. if(k< cregistros){ archivo. 108. int n=0. } k=n. catch (IOException e) { System. clave=archivo. 111."rw").out. archivo.length( ) / tregistro.println("Error al escribir"). e1=archivo. no existe").readInt( ).seek(r*58). String nombre="". 128. 142.readInt( ). ++i){ n1 += archivo. } 122. 109. } 118. 115.writeInt(c2). 145. archivo. 112. String n1="".readInt( ). 130. } 123. 150. 147. 129. int k. catch(FileNotFoundException f) { System. 140. salir=true.writeInt(c1). 136. } 124. 144. 119.106. 39 Profesor: Carlos A.writeChars(n1). boolean cond=false. 152.out. }while(salir). 125. 114. 126. archivo.writeChars(n1). break. int c = Integer. 138. 132. 151.seek(n*58). int e1. Ruiz De La Cruz Melo . 143. 131.parseInt(leer("dame clave a buscar")). 110. cregistros=archivo.close().

out. archivo. clave=archivo. n++. 157.close( ).dat"). void L( ){ 173. ++i){ nombre += archivo. RandomAccessFile archivo2=new RandomAccessFile(arch. } 158. 156. } 172. for(int i = 0.setLength(n*58). else { archivo.println(clave+" "+nombre+" "+edad). 194. 198.println("Error al escribir"). 197. catch(FileNotFoundException f) { System..out. catch (IOException e) { System. 180. } 192.break. i < 25. nombre="". } 171.out. } 170. for (int r=0. 187. r < cregistros. try { 177. 163. archivo2. no existe"). 186."rw"). File arch=new File("archivo1. switch (Integer. n1="". 182. } 165.println("Arch. 178. 188.println("Error al escribir"). 185.close( ). 195. public static void main(String[ ] args) { ARCH a=new ARCH(). 161. int clave=0.println("Ingresar <1>\n Ver <2> \n Ordenar <3> \n Modificar <4> \n Borrar <5> \n Salir <6>"). 175. 40 Profesor: Carlos A. 168. } 169.154."rw"). String nombre="".E( ).readChar( ). File arch2=new File("archivo1. archivo. archivo2.close().out. 196. catch (IOException e) { System. } 191.dat"). }. 164.out. } 189. System. int edad=0. for(. } 166.println("Arch.){ System. r++){ 181. 162.leer("opcion : "))){ case 1:a. edad=archivo. 176. 184. no existe"). break. 155. 179. catch(FileNotFoundException f) { System.readInt( ).length( ) / tregistro.readInt( ). } 167. 174. }.out. } 190. 160. RandomAccessFile archivo=new RandomAccessFile(arch.parseInt(a. 159. 193. 183.writeInt(e1). Ruiz De La Cruz Melo .close( ). else archivo. cregistros=archivo.

U. ANALISIS DE RESULTADOS • • • • Es un concepto importante. nombre de la empresa y lista de ítems (código. case 6:System. Ruiz De La Cruz Melo 41 . segunda edición Andrew C.O( ). C++. string. Jr. Aprendiendo Borland C++ Builder • • • • • 3 en 21 Días.M( ). 203. 205. 202. 1998. Al objeto no persistente lo llamamos efímero. Alfaomega Ra-Ma Luis Joyanes Aguilar. por el mismo programa o por otros.199. Prentice Hall. case 5:a. precio unitario. pudiendo ser reconstruido por el mismo u otro proceso.B( ). 6. como Java. 200. Staugaard.A.break. case 2:a. BIBLIOGRAFIA • Kent Reisdorph. una información completa ideal para todo usuario de Turbo C/C++. etc). case 3:a. 1998 Herbert Schildt. descripción del producto. Programación Orientada a Objetos. } } } // cierra main } // cierra clase Ejercicio Escriba un programa usando archivos que permita guardar la información de una factura con datos como fecha. Un objeto persistente es aquél que conserva su estado en un medio de almacenamiento permanente. que agrupa datos de diferentes tipos (enteros. por ejemplo. A. case 4:a. Java 2 Curso de Programación. Prentice Hall Hispanoamericana S. 1999 Profesor: Carlos A. etc. Esto presenta la ventaja de que además de incluir los campos tradicionales de un registro (en forma de atributos) también puede incorporar una serie de métodos que permiten procesar de manera mas fácil los campos o atributos de la clase. En los lenguajes de programación OO. Osborne/ McGraw-Hill. cantidad) 5. Los datos generalmente se almacenan con algún tipo de organización.L( ). así como en diferentes instalaciones de hardware en el mismo momento. pues permite que un objeto pueda ser usado en diferentes momentos a lo largo del tiempo. 206. 201. Construcción de Software Orientado a Objetos. McGraw-Hill Interamericana De España S. 204. Turbo C/C++ Manual de Referencia. un registro. Prentice Hall Hispanoamericana S. Fco. 1998 Bertrand Meyer. Técnicas Estructuradas y Orientadas a Objetos.break. Segunda edición. 207.exit(0).A.break.break. los datos se organizan en un tipo de datos definido por el usuario (TAD) que recibe el nombre de Clase. Javier Ceballos.

Sign up to vote on this title
UsefulNot useful