You are on page 1of 26

Archivos Java - Presentation Transcript

1. Escritura y Lectura de Archivos Temas Primeras Consideraciones Escritura Lectura Consejo 2. Primeras Consideraciones o Lo primero a tener en cuenta es hacer la validacion de si el archivo existe o no. o File f=new File(mi_archivo.txt); o if (f.exists()) { //aqui pondremos el codigo para leer o escribir o } o Para trabajar con archivos deben recordar importar la clase IO. o Import java.io.*; 3. Escritura o File f=new File(mi_archivo.txt); o FileWriter fw= new FileWriter(f, false ); o fw.write(texto); o fw.close(); o La unica consideracion es en el codigo en rojo, teniendo 2 alternativas: o false: borra el contenido del archivo y recien escribe o true: agrega el contenido al final (no borra nada) 4. Lectura o String texto=; o FileReader fr = new FileReader(mi_archivo.txt); o BufferedReader lector = new BufferedReader(fr); o String s; o while((s = lector.readLine()) != null){ texto += s + ; o } o System.out.println(texto);

o o o o o

Bucle que lee linea a linea hasta el final del archivo En la variable texto tendremos todo el archivo completo. En la varibale 's' tendremos cada linea que se va leyendo 5. Consejos Para evitar que el programa se 'muera' es recomndable el uso de un Try-Catch: try{ //aqui el codigo para leer o escribir o } catch(IOException e){ System.out.println(error); o } 6. Creditos o Eduardo Federico Santillan (Perro) o UCASAL OSUM o Mas informacion sobre el tema en: o http://lenguajes-x.com.ar/?cat=14

o o

// Crea un archivo de acceso aleatorio, escribiendo 100 registros vacos en el disco.

2 import java.io.*; 3 import javax.swing.*; 4 5 public class CrearArchivoAleatorio { 6 7 8 9 // permitir al usuario seleccionar el archivo a abrir 10 private void crearArchivo() 11 { 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 // mostrar error si el nombre del archivo es invlido if ( nombreArchivo == null || nombreArchivo.getName().equals( "" ) ) JOptionPane.showMessageDialog( null, "Nombre de archivo incorrecto", // obtener el archivo seleccionado File nombreArchivo = selectorArchivo.getSelectedFile(); // si el usuario hizo clic en el botn Cancelar del cuadro de dilogo, regresar if ( resultado == JFileChooser.CANCEL_OPTION ) return; int resultado = selectorArchivo.showSaveDialog( null ); // mostrar cuadro de dilogo para que el usuario pueda seleccionar el archivo JFileChooser selectorArchivo = new JFileChooser(); selectorArchivo.setFileSelectionMode( JFileChooser.FILES_ONLY ); private static final int NUMERO_REGISTROS = 100;

28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53

"Nombre de archivo incorrecto", JOptionPane.ERROR_MESSAGE );

else {

// abrir el archivo try { RandomAccessFile archivo = new RandomAccessFile( nombreArchivo, "rw" );

RegistroCuentasAccesoAleatorio registroEnBlanco = new RegistroCuentasAccesoAleatorio();

// escribir 100 registros en blanco for ( int cuenta = 0; cuenta < NUMERO_REGISTROS; cuenta++ ) registroEnBlanco.escribir( archivo );

archivo.close(); // cerrar el archivo

// mostrar mensaje indicando que el archivo se cre JOptionPane.showMessageDialog( null, "Se cre el archivo " + nombreArchivo, "Estado", JOptionPane.INFORMATION_MESSAGE );

System.exit( 0 ); // terminar el programa

} // fin del bloque try

54 55 56 57 58 59 60 61 62 63

// procesar excepciones durante operaciones de apertura, escritura o cierre del archivo catch ( IOException excepcionES ) { JOptionPane.showMessageDialog( null, "Error al procesar el archivo", "Error al procesar el archivo", JOptionPane.ERROR_MESSAGE );

System.exit( 1 ); }

} // fin de instruccin else

64 } // fin del mtodo crearArchivo 65 66 public static void main( String args[] ) 67 { 68 69 70 } 71 72 } // fin de la clase CrearArchivoAleatorio 73 74 //casidiablo CrearArchivoAleatorio aplicacion = new CrearArchivoAleatorio(); aplicacion.crearArchivo();

Excepciones y Archivos

Excepciones
El trmino excepcin se utiliza cuando algo sali mal, es decir, cuando ocurri un error. Como seguramente usted sabe, existe un gran nmero de situaciones por la que el software puede fallar, pero el software de buena calidad debe de enfrentar esos problemas de manera satisfactoria. En Java una excepcin es un objeto que define una situacin inusual o un error. Cuando se crean sistemas de software y de hardware, la mayora se encuentra en forma de elementos empacados, por ejemplo, tarjetas de circuitos, clases y mtodos de Java. Para simplificar el proceso de diseo, es esencial tratar estos elementos como encapsulados, de tal forma que no es necesario preocuparse de cmo funcionan internamente, pero si es necesario que informen a nuestro software sobre las situaciones de error. Los sistemas complejos constan de una jerarqua de mtodos y algunas excepciones pueden manejarse de forma local en el mtodo que ocurren, y en algunos otros casos pueden pasarse a mtodos de nivel ms alto, por supuesto todo depende de la naturaleza del error. As, existen varias categoras de errores, las cuales pueden ser tratadas en distintos lugares. As, un programa puede estar diseado para procesar las excepciones en tres formas distintas:

No manejarla manejar la excepcin cuando ocurre manejar la excepcin en algn otro punto del programa

Un ejemplo de un programa que no maneja excepciones es el siguiente:

Donde al ejecutarse el programa se detiene y marca un error, de tal forma que la ltima sentencia nunca ser ejecutada. En general el cdigo para manejar errores podra ser:
si algoSaleMal encargarse del problema otro situacin normal

sin embargo cuando se realizan ms acciones el cdigo:


hacerA ( ) hacerB ( ) hacerC ( )

se convierte en:
hacerA ( ) si A sali mal encargarse del problema cuando A sali mal otro

comienza hacerB ( ) si B sali mal encargarse del problema cuando B sali mal otro comienza hacerC ( ) si C sali mal encargarse del problema cuando C sali mal termina termina

Ya que no se espera que los casos de error ocurran muy a menudo, Java ofrece apegarnos a la codificacin para el caso normal, y manejar las excepciones en un rea separada del programa. Las excepciones en Java son objetos, por lo que es necesario utilizar el operador new para crear una instancia de una clase apropiada de excepciones. Para indicar que ha ocurrido una excepcin, se dice que se ha lanzado y cuando se detectan en cualquier otra parte, se dice que son atrapadas. Java tiene las palabras clave:
throws throw try catch

para llevar a cabo estas tareas. Ejemplo:


/** * Aplicacin para duplicar un entero dado por el usuario * Sin manejo de excepciones * * Adaptado de Bell & Parr, Java para estudiantes, Prentice-Hall, 2003 */ public class ApliD1 { public static void main() { // crear objetos System.out.print ("Dame un entero: "); int entrada = Teclado.readInt (); System.out.print("El nmero duplicado es: "); int salida = 2*entrada; } }

En caso de no introducir un entero se produce el siguiente error:

Por supuesto este mismo ejemplo puede crearse como un applet:


import java.awt.*; import java.awt.event.*; import java.applet.*; /** * Applet para duplicar un entero dado por el usuario * Sin manejo de excepciones * * Adaptado de Bell & Parr, Java para estudiantes, Prentice-Hall, 2003 */ public class D1 extends Applet implements ActionListener { // Datos miembro private TextField private Label /**************** Constructor ****************/ public D1() { // crear objetos etiqueta = new Label("Dame un entero: "); entrada = new TextField(30); resultado = new Label("El nmero duplicado es: "); salida = new TextField(30); //la salida no es editable salida.setEditable (false); // aade objetos al applet add (etiqueta); add (entrada); entrada, salida; etiqueta, resultado;

entrada.addActionListener (this); add (resultado); add (salida); } /* Si no es entero el programa marca un error*/ public void actionPerformed(ActionEvent event) { if (event.getSource () == entrada) { int num = Integer.parseInt (entrada.getText ()); salida.setText ( "" +(2*num)+ "! "); } } }

y entonces usted puede ejecutarlo desde el servidor: D1 Tambin se puede utilizar el enunciado try-catch para que se se informe al usuario en caso de introducir algo que no fuera un entero:
import java.awt.*; import java.awt.event.*; import java.applet.*; /** * Applet para duplicar un entero dado por el usuario * Con manejo de excepciones utilizando try-catch * * Adaptado de Bell & Parr, Java para estudiantes, Prentice-Hall, 2003 */ public class Demo1 extends Applet implements ActionListener { // Datos miembro private TextField private Label /**************** Constructor ****************/ public Demo1() { // crear objetos etiqueta = new Label("Dame un entero: "); entrada = new TextField(30); resultado = new Label("El nmero duplicado es: "); entrada, salida; etiqueta, resultado;

salida = new TextField(30); //la salida no es editable salida.setEditable (false); // aade objetos al applet add (etiqueta); add (entrada); entrada.addActionListener (this); add (resultado); add (salida); } /* Se utiliza el enunciado try-catch para la entrada. * Si no es entero marca un mensaje de error*/ public void actionPerformed(ActionEvent event) { if (event.getSource () == entrada) try { int num = Integer.parseInt (entrada.getText ()); salida.setText ( "" +(2*num)+ "! "); } catch (NumberFormatException e) { salida.setText ("Error en el nmero: vuelva a escribirlo "); } } }

que al ejecutarlo con un "error" nos produce un mensaje adecuado: Demo1 La parte clave del programa es:
try { int num = Integer.parseInt (entrada.getText ()); salida.setText ( "" +(2*num)+ "! "); } catch (NumberFormatException e) { salida.setText ("Error en el nmero: vuelva a escribirlo "); }

que es donde si algo sale mal en parseInt se ejecutar el cdigo que est dentro del catch La estructura de control try-catch tiene la siguiente forma:
try { enunciados } catch (AlgunaExcepcin e)

{ enunciados }

y Java tratar de ejecutar el bloque de enunciados dentro del try, si no ocurre ninguna excepcin, se ignorar el bloque de enunciados dentro del catch y si se produce una excepcin del bloque try, entonces se puede ejecutar el bloque catch especificndo el tipo de excepcin que se quiere tratar. Si ocurre un tipo que no est especifcado entonces no se ejecutar el bloque catch. Recuerde que las variables declaradas dentro de un bloque existen dentro de l y no fuera de l, de tal forma que si declara una variable dentro del bloque try, no podr utilizarla dentro del bloque catch. Por supuesto que una solucin a este problema es declarar dicha variable fuera y antes de estos bloques.

Ejercicios: 1. Escriba una aplicacin que lea dos enteros y muestre el resultado de a/b. Despus incorpore el manejo de excepciones de tal forma que se muestre un mensaje cuando no se introduzcan nmeros enteros. 2. Escriba un applet que introduzca una cadena que represente una fecha de la forma MM/DD/AA por ejemplo 20/03/04, use la clase StringTokenizer para dividirla y producir un mensaje de error si un elemento no es numrico, si no se encuentra o si se especifica una fecha imposible. Ignore los aos bisiestos.

Propagacin de excepciones El uso de mtodos en tiempo de ejecucin es jerrquico (un mtodo de nivel superior invoca a los mtodos de nivel inferior, etc.) y este patrn de llamadas es impredecible antes del tiempo de ejecucin, ya que la decisin sobre si se va a invocar o no a un mtodo podra ser parte de una instruccin de seleccin, con base en los datos de entrada. Imagine que el mtodoA llama al mtodoB, que a su vez llama al mtodoC, la bsqueda de un bloque catch apropiado comienza en mtodoC. Si no se encuentra uno, la bsqueda avanza hacia el mtodoB. Si este mtodo no cuenta con un bloque catch, entonces la bsqueda avanza hacia el mtodoA, y si el mtodo de nivel superior no cuenta con un bloque catch, se muestra un mensaje de excepcin. Si el programa es un applet, continuar ejecutndose (o al menos tratar de hacerlo) y sus resultados no sern confiables. Si una excepcin no se atrapa cuando ocurre, entonces se propaga al mtodo que

lo mand llamar. Ejemplo: Considere las siguientes dos clases:


/** * Demuestra la propagacin de excepciones * * Adaptado de Lewis & Loftus */ public class Propagacin { public static void main (String [] args) { AmbitoExcepcin demo = new AmbitoExcepcin (); System.out.println ("Inicio del programa"); demo.nivel1 (); System.out.println ("Fin del programa"); } } /** * Demuestra la propagacin de excepciones * * Adaptacin de Lewis & Loftus */ public class AmbitoExcepcin { //Atrapa y maneja excepciones void nivel1 () { System.out.println ("Nivel 1, inicio"); try { nivel2 (); } catch (ArithmeticException problema) { System.out.println (); System.out.println ("El mensaje de la excepcin es: " + problema.getMessage ()); System.out.println (); System.out.println ("Llamadas en la pila"); problema.printStackTrace (); System.out.println (); } System.out.println ("Nivel 1, final"); } //Sirve como nivel intermedio. La excepcin se propaga a travs de nivel1 void nivel2 () {

System.out.println ("Nivel 2, inicio"); nivel3 (); System.out.println ("Nivel 2, final"); } //Realiza un calculo que produce una excepcin, que no se maneja en este nivel void nivel3 () { int num = 10, den = 0; System.out.println ("Nivel 3, inicio"); int result = num/den; System.out.println ("Nivel 3, final"); } }

Que al ejecutarse produce la siguiente salida:

Jerarqua de las excepciones java.lang.Object | +--java.lang.Throwable | +--java.lang.Exception | +--java.lang.RuntimeException

ArithmeticException, ArrayStoreException, CannotRedoException, CannotUndoException, ClassCastException, CMMException, ConcurrentModificationException, EmptyStackException, IllegalArgumentException, IllegalMonitorStateException,

IllegalPathStateException, IllegalStateException, ImagingOpException, IndexOutOfBoundsException, MissingResourceException, NegativeArraySizeException, NoSuchElementException, NullPointerException, ProfileDataException, ProviderException, RasterFormatException, SecurityException, SystemException, UndeclaredThrowableException, UnsupportedOperationException
finally

La sentencia finally permite colocar cdigo en un slo lugar que se ejecutar ya sea despus de una excepcin, o despus de la correcta ejecucin del bloque try. Su sintxis es:
try { // se realiza si no existe ninguna excepcin } catch (Exception) { //se ejecuta cuando existi algn error o situacin no prevista } finally { //se ejecuta si se ejecut el try o el catch }

Considere el caso en el que un programa abre un archivo correctamente pero encuentra un error al leer de ese archivo. Una accin correctiva deseable sera cerrar el archivo. Al leer una lnea (un valor String) de un archivo se puede producir una excepcin IOException, y as la lgica para leer una sere de lneas sera.
String lnea; try { while (lnea = archivo.readLine () != null) { //procesar lnea } } catch (IOException e) { error.setText ("Error en entrada"); } finally { archivo.close (); }

Archivos

Algunas de las diferencias ente la RAM (memoria de acceso aleatorio) y los dispositivos de almacenamiento externo (discos, CD, stikers) son:

El tiempo requerido para tener acceso a un elemento en la RAM es mucho menor El costo de la RAM es mayor Los datos almacenados en la RAM son temporales. Los dispisitivos de almacenamiento externo pueden guardar los datos de manera semi-permanente La RAM se utiliza para guardar los programas al ser ejecutados. stos se copian de un dispositivo de almacenamiento externo inmediatamente antes de la ejecucin Normalmente la capacidad de los dispositivos de almacenamiento externo es mayor

Una tarea comn en programacin es leer y escribir archivos. La informacin almacenada en un archivo pueden ser datos byte o caracteres (texto), y pueden ser leidos en la misma forma. Java cuenta aproximadamente con 20 clases para el acceso a archivos, cada una con su propio conjunto especfico de mtodos. Una decisin importante radica en elegir entre el acceso de flujo y el acceso aleatorio. Al utilizar el acceso de flujo en un archivo, se debe tratar como una secuencia de elementos que deben ser procesados uno tras otro, empezando con el primero. Para muchas tareas, esto es completamente inapropiado. El acceso aleatorio permite accesar uno posicin espcfica en el archivo. En estas aplicaciones (como las bases de datos) esto puede agilizar el procesamiento, pero tambin es ms complicado de programar. En realidad es probable que se utilice una biblioteca de clase de bases de datos en ez de codificar el acceso de bajo nivel al disco. Por esta razn nos enfocaremos en los flujos. Los applets, pueden descargarse de un sitio remoto y se ejecutan dentro de un navegador. No obstante, hay un problema relacionado con la seguridad, el applet puede contener errores o tal vez haya sido escrito con malicia. Una de las reas clave a las que pueden dirigirse los applets maliciosos es a la eliminacin de archivos, de tal forma que se podran crear applets que eliminaran todos los archivos de una computadora. Por esta razn, los navegadores geeneralmente se configuran para evitar que los applets tengan acceso a los archivos del equipo en los que se ejecutan. Sin embargo, pueden tener acceso a los archivos en el servidor del que fueron descargados. As, si se desea escribir programas que tengan acceso a archivos, se deben escribir aplicaciones y no applets . La posible excepcin a lo anterior es el crecimiento de los sistemas intranet, que utilizan tecnologa WWW pero estn restringidos a que puden utilizarse solamente dentro de una organizacin. En esta situacin, podra considerarse el uso de applets confiables.

Archivos de texto
Si se desea procesar datos de un archivo exsitente, se debe: 1. Abrir el archivo 2. Leer o introducir los datos en las variables, un elemento a la vez 3. Cerrar el archivo cuando se termine de trabajar con l Para transferir algunos datos de ciertas variables a un archivo, se debe: 1. Abrir el archivo 2. Extraer o escribir los elementos en la secuencia requerida 3. Cerrar el archivo cuando se termine de trabajar con l Al leer un archivo, todo lo que puede hacerse es leer el siguiente elemento. Si, por ejemplo, quisiramos examinar el ltimo elemento, tendramos que codificar un ciclo para leer cada uno de los elementos en turno, hasta llegar al elemento requerido. Para muchas tareas, es conveniente visualizar un archivo como una serie de lneas de texto, cada una compuesta por un nmero de caracteres y que termina con el carcter de fin de lnea. Un beneficio de esta forma de trabajo es la facilidad de transferir archivos entre aplicaciones. As se podra crear un archivo ejecutando un programa en Java y despus cargarlo en un procesador de palabras, editor de texto o correo electrnico. Las clases de flujo estn organizadas de la siguiente forma:
Reader BufferedReader InputStreamReader FileReader Writer PrintWriter FileWriter

Para procesar archivos se utilizan las clases BufferedReader y PrintWriter para leer y escribir lneas de texto, y para la entrada que no provenga de archivos (desde el teclado y pginas Web) tambin se utiliza InputSreamReader. Los programas que utilizan archivos deben contener la instruccin: import java.io.*; "Bfer" significa que, el software lee un gran trozo de datos del dispositivo de almacenamiento externo y lo guarda en la RAM, de tal forma que invocaciones sucesivas de los mtodos que necesitan leer una pequea cantidad de datos del dispositivo de almacenamiento de archivos puedan obtener rpidamente los datos de la RAM. Por lo tanto, un bfer acta como un amortiguador entre el dispositivo de almacenamiento y el programa.

Escribir un archivo de texto requiere el uso apropiado de clases para crear el flujo de salida y llamar a los mtodos para escribir los datos. La clase FileWriter representa un archivo texto de salida. La clase PrintWriter ofrece los mtodos print y println similares a los de System. Despus de terminar de crear o utilizar un archivo es muy recomendable que se cierre, ya que de lo contrario no se garantiza que los datos estarn almacenados en un dispositivo semi-permanente. Por ejemplo, suponga que desea generar un archivo de prueba que contenga nmeros enteros aleatorios.
import java.io.*; /** * Demuestra el uso de un archivo texto de salida * * Adaptacin Lewis & Loftus */ public class PruebaDatos { //throws se utiliza cuando no desean manejarse las excepciones public static void main (String [] args) throws IOException { final int MAX = 10; int valor; String arch = "prueba.dat"; FileWriter fw = new FileWriter (arch); BufferedWriter bw = new BufferedWriter (fw); PrintWriter salArch = new PrintWriter (bw); for (int i = 1; i <= MAX; i++) { for (int n = 1; n <= MAX; n++) { valor = (int) (Math.random () * 100); salArch.print (valor + " "); } salArch.println (); } //se cierra el archivo salArch.close (); System.out.println ("El archivo de salida ha sido creado: " + arch); } }

Ejercicio:

Ejecute la clase PruebaDatos y abra el archivo "prueba.dat" creado. La clase FileReader representa un archivo de entrada que contiene caracteres. Su constructor inicializa la relacin entre el programa y el archivo, abriendo un stream (flujo) a partir del cual se leeran los datos. La siguiente clase permite leer el archivo "prueba.dat" utilizando las clases FileReader y BufferReader:
import java.io.*; /** * Demuestra el uso de un archivo de texto * */ public class ChecaDatos { public static void main (String [] args) throws IOException { String arch = "prueba.dat"; String lnea; //Creacin del lector de archivo FileReader fr = new FileReader (arch); //Para manejo de entrada; BufferedReader entArch = new BufferedReader (fr); //Se lee la primera lnea lnea = entArch.readLine (); while (lnea != null) { System.out.println (lnea + "\n"); lnea = entArch.readLine (); //Se lee una nueva lnea } entArch.close (); } }

Estas mismas clases (FileReader y BufferedReader) se pueden utilizar para manejo de objetos. Por ejemplo considere las siguentes dos clases: Cosa e Inventario:

import java.text.DecimalFormat; /** * Representa el objeto de un inventario * * Adaptacin Lewis & Loftus */ public class Cosa { private String nombre; private int unidades;

private float precio; private DecimalFormat fmt; Cosa (String n, int u, float p) { nombre = n; unidades = u; precio = p; fmt = new DecimalFormat ("0.##"); } public String toString () { return nombre + ":\t" + unidades + " a $" + precio + " = " + fmt.format ((unidades * precio)); } } import java.util.StringTokenizer; import java.io.*; /** * Demuestra el uso de un archivo de caracteres como stream de entrada * * Adaptacin Lewis & Loftus */ public class Inventario { public static void main (String [] args) { final int MAX = 100; Cosa [] items = new Cosa [MAX]; StringTokenizer tokenizer; String lnea, nombre, arch = "inventario.dat"; int unidades, cuenta = 0; float precio; try { FileReader fr = new FileReader (arch); BufferedReader archEnt = new BufferedReader (fr); lnea = archEnt.readLine (); while (lnea != null) { tokenizer = new StringTokenizer (lnea); nombre = tokenizer.nextToken (); try { unidades = Integer.parseInt (tokenizer.nextToken ()); precio = Float.parseFloat (tokenizer.nextToken ()); items [cuenta++] = new Cosa (nombre, unidades, precio); } catch (NumberFormatException exc) { System.out.println ("Error en la entrada. Linea

ignorada"); System.out.println (lnea); } lnea = archEnt.readLine (); } archEnt.close (); for (int s = 0; s < cuenta; s++) System.out.println (items [s]); } catch (FileNotFoundException exc) { System.out.println ("El archivo " + arch + " no fue encontrado "); } catch (IOException exc) { System.out.println (exc); } } }

Cuya salida es:

Ejercicio escriba una clase que permita escribir el archivo inventario.dat anterior con al menos 5 objetos. La clase File

Esta clase ofrece la capacidad de manipular archivos y directorios en general. No se utiliza para tener acceso a los datos dentro de los archivos. Se necesita utilizar la instruccin: import java.io.*; La mayora de los sistemas operativos ofrecen una estructura jerrquica con una ruta para avanzar a travs de la misma, cuya forma es:

d:\estructuraDeDatos\Java\Archivos\Inventario.java sta es una ruta estilo Windows que utiliza '\' como separador. En un sistema UNIX se utiliza como separador '/'. Si usted necesita escribir software para manipular rutas y que funcione en cualquier sistema puede averiguar cal es el separador de archivos haciendo referencia a la constante de la cadena File.separator. La ruta mostrada anteriormente es absoluta, empieza desde la parte superior del directorio y lo lleva hasta el archivo. No obstante, a veces esto es irrelevante: slo necesitamos tratar con rutas que sean relativas al directorio actual. Por ejemplo, si nos encontramos en el directorio Java, entonces la ruta de Inventario.java sera Archivos\Inventario.java. Inicialmente debemos construir una instancia de la clase File proporcionando una cadena. Una vez creada se puede utilizar. Considere la siguiente instruccin: File archivo = new File ("c:\\estructuraDeDatos\\Java\\Archivos\\Inventario.java"); Como el caracter de escape '\' es casualmente el mismo que el separador de archivos en Window, se necesita decir que es simplemente un caracter normal de la cadena en vez de tener un significado especial, por lo que hay que anteponerle un caracter de escape. As, \\ representa a \.

Funcin getPath Encuentra la ruta relativa getAbsolutePat h Encuentra la ruta absoluta

Ejemplo String relativa = archivo.getPath( ); Devuelve "Inventario.java" String absoluta = archivo.getAbsolutePath ( ); Devuelve "c:\estructuraDeDatos\Java\Archivos\Inventario.j ava"

exists boolean existe = archivo.exists ( ); Comprueba que Devuelve true o false el archivo exista isDirectory Comprueba si es un directorio boolean comprobarDirectorio = archivo.isDirectory ( ); Devuelve true si el archivo es un directorio y false en otro caso

length long longitud = archivo.length ( ); Tamao del archivo en bytes list String [ ] todosLosArchivos = archivo.list ( );

Llena un arreglo Como "Inventario.java" no es un directorio regresara null de cadeas con la lista de los nombres de los archivos que hay dentro de un directorio

Ejemplo: MiniNavegador

Ejercicios: 1. Cree una aplicacin que lea de teclado una oracin dada por el usuario y que sta se escriba en un archivo. 2. Cree una apliacin para mostrar directorios en una lista, que pida al usuario una ruta absoluta y luego muestre todos los nombres de archivos que haya dentro de ese directorio. Si alguno de los archivos es un directorio, debe imprimirse la palabra "dir" despus de su nombre. Serializacin

Cuando un programa termina, los datos usados se destruyen a menos que se almacenen de manera externa. qu pasa cuando se desea almacenar un objeto, un arreglo de objetos o alguna estructura compleja? Se puede escribir cdigo que almacene todas las piezas del objeto de forma separada y despus reconstruir el objeto con esa informacin, pero esto es un proceso tedioso. La persistencia permite que un objeto pueda "vivir" separado de la ejecucin del programa que lo construy. Java posee un mecanismo para crear objetos persistentes llamado serializacin de objetos. Un objeto se serializa transformndolo en una secuencia de bytes que representan al objeto. Posteriormente esta informacin puede restablecerse. Una vez serializado el objeto puede almacenarse en un archivo o transmitirse por la red.

Un objeto que desea serializarse debe tener la interface Serializable, que sirve como bandera al compilador. Para serializar un objeto se invoca al mtodo writeObject de ObjectOutputStream. Para deserializar un objeto se invoca al mtodo readObject de ObjetInputStream. Por ejemplo, suponga la clase coche implementada como serializable y que se desea almacenar en un archivo. Para hacer esto, debe crearse un FileOutputStream y envolverlo en un ObjectOutputStream:
FileOutputStream salArch = new FileOutputStrem ("info.dat"); ObjectOutputStream salStream = new ObjectOutputStream (salArch);

para serializar el objeto se involca al mtodo writeObject:


salStream.writeObject (miCoche);

Para invertir el proceso, primero se crea un flujo (stream de entrada):


FileInputStream entArch = new FileInputStream ("info.dat"); ObjectInputSteam entStream = new ObjectInputStream (entArch);

para leer y deserializar el objeto:


Coche c = (Coche) entStream.readObject ();

El mtodo readObject regresa una referencia a un Object, por lo que debe de realizarse un cast a la clase apropiada. Ejemplo: Considere la clase Coche, para guardar en un archivo objetos de tipo coche se utiliza la clase EscribeArchivoCoches y para leer de archivo objetos de tipo coche se utiliza LeeArchivoCoches .

Ejercicios: 1. Ejecte EscribeArchivoCoches y LeeArchivoCoches. Despus inserte algn otro objeto de tipo coche y vea que sucede 2. Modifique EscribeArchivoCoches y LeeArchivoCoches, para que manejen excepciones a travs de try-catch. 3. Construya un directorio de sus amigos. Considere que la informacin ms relevante para representar a un amigo es: nombre, telfono, correo-e y fecha de cumpleaos. Utilice objetos serializables para escribir y leer de archivo. (Para entregar)

Compresin
La biblioteca de E/S de Java tiene clases que dan soporte a la lectura y escritura de flujos en formato comprimido. Son parte de las jerarquas InputStream y OutputStream. Aunque existen muchos algoritmos de compresin, los ms comunes son ZIP y GZIP. El uso de clases de compresin es directo, simplemente se envuelve el flujo de salida en un GZIPOutputStream o en un ZipOutputStream, y el flujo de entrada en un GZIPInputStream o en un ZipInputStream. Todo lo dems es lectura y escritura de E/S ordinarias.

Compresin con GZIP


Es apropiada para comprimir un nico flujo de datos. Ejemplo: CompresinGZIP

Almacenamiento mltiple con ZIP


La biblioteca que soporta ZIP es ms completa. Con ella, es posible almacenar de manera sencilla mltiples archivos, adems se puede calcular y verificar la suma de comprobacin del archivo a travs de las clases Chechsum. Hay dos tipos de Chechsum: Adler32, ms rpido y CRC32, ms lento pero ligeramente ms exacto. Para cada archivo que se desee aadir es necesario llamar a putNextEntry () y pasarle un objeto ZipEntry. Este objeto contiene una interfaz que permite extraer y modificar todos los datos disponibles en esa entrada particular del archivo ZIP: nombre, tamao comprimido y descomprimido, fecha, suma de comprobacinCRC, datos de campo extra, comentarios, mtodos de compresin y si es o no una entrada de directorio. Sin embargo, incluso aunque el formato ZIP permite poner contraseas a los archivos, no hay soporte para esta faceta en la bilbioteca ZIP de Java. Y aunque tanto CheckedInputStream como CheckedOutputStream soportan ambos sumas de comprobacin, Adler32 y CRC32, la clase

ZipEntry slo soporta una interfaz para CRC. Para extraer archivos, ZipInputStream tiene un mtodo getNextEntry () que devuelve la siguiente ZipEntry si es que la hay. Otra alternativa es usar un objeto ZipFile, que tiene un mtodo entries () para devolver una Enumeration al ZipEntries. Para leer la suma de comprobacin hay que tener algn tipo de acceso al objeto Checksum asociado. Aqu, se retiene una referencia a los objetos CheckedOutputStream y CheckedInputStream, pero tambin se podra simplemente guardar una referencia al objeto Checksum. Ejemplo: CompresinZIP

Recursividad
Aplicaciones recursivas : Cadena T Sumatoria Un applet recursivo: Dibujos