ING1310 Introducción a la Computación Archivos Carlos Reveco creveco@dcc.uchile.cl careveco@miuandes.cl Facultad de Ingeniería/Universidad de los Andes/Chile Rev : 232 C.Reveco Facultad de Ingeniería/Universidad de los Andes/Chile ING1310 Clase 17 1 / 28
En esta clase 1 Resumen Clase Anterior 2 Ejercicio Clase 16 Enunciado Solución 3 Archivos Definición Streams Lectura Escritura Excepciones en Archivos 4 Ejemplo Enunciado Solución C.Reveco Facultad de Ingeniería/Universidad de los Andes/Chile ING1310 Clase 17 2 / 28
Resumen Clase Anterior C.Reveco Facultad de Ingeniería/Universidad de los Andes/Chile ING1310 Clase 17 3 / 28
Resumen Clase 16 String es una clase que representa una cadena de caracteres. Los caracteres se representan con la clase char Cada uno tiene una representación numérica definida por la tabla ASCII Como clase, String tiene métodos: charat obtener un caracter del String compareto compara lexicográficamente dos String equals/equalsignorecase revisa igualdad entre dos String length retorna número de caracteres substring obtiene un pedazo del String indexof busca un String dentro de otro C.Reveco Facultad de Ingeniería/Universidad de los Andes/Chile ING1310 Clase 17 4 / 28
Ejercicio Clase 16 C.Reveco Facultad de Ingeniería/Universidad de los Andes/Chile ING1310 Clase 17 5 / 28
Ejercicio Clase 16 Enunciado C.Reveco Facultad de Ingeniería/Universidad de los Andes/Chile ING1310 Clase 17 6 / 28
Ejercicio String: Patentes Un sistema debe registrar las patentes de autos que tienen permitido estacionar en un cierto lugar. Dada la gran cantidad de patentes posibles, las ha organizado dentro de un arreglo que facilita su búsqueda. La idea es que la patente se divide en 2, dejando su parte númerica (2 dígitos) separada de sus letras (4). Luego, en un arreglo de 100 String se tienen las letras de las patentes que están registradas en el sistema, y cuya parte numérica corresponde con el índice en el arreglo. Por ejemplo, si tenemos: [0] --> " BCDF "... [45] --> " BCDFFGHJ " [46] --> " PNKK "... [99] --> " RGSDPNKKRTTY " Las siguientes patentes tendrían permiso de estacionar: BCDF00, BCDF45, FGHJ45, PNKK46, RGSD99, PNKK99, RTTY99. Ahora bien, las patentes DFFG45 o GSDP99 no tendrían permiso de estacionar. Implemente el método public boolean buscarpatente(string[] habilitadas, String patente) el cual retorna verdadero si la patente se encuentra habilitada, o falso en otro caso.
Ejercicio Clase 16 Solución C.Reveco Facultad de Ingeniería/Universidad de los Andes/Chile ING1310 Clase 17 8 / 28
public boolean buscarpatente ( String [] habilitadas, String patente ) { int numero = Integer. parseint ( patente. substring (4)); String letras = patente. substring (0, 4); int posicion = habilitadas [ numero ]. indexof ( letras ); while ( posicion!= -1 && posicion %4!= 0) posicion = habilitadas [ numero ]. indexof ( letras, posicion ); } if( posicion == -1) return false ; else return true ; C.Reveco Facultad de Ingeniería/Universidad de los Andes/Chile ING1310 Clase 17 9 / 28
Archivos C.Reveco Facultad de Ingeniería/Universidad de los Andes/Chile ING1310 Clase 17 10 / 28
Archivos Definición C.Reveco Facultad de Ingeniería/Universidad de los Andes/Chile ING1310 Clase 17 11 / 28
Motivación La gran cantidad de información que manejan los programas no siempre puede estar en memoria volatil. Muchas veces es necesaria mantenerla en Discos Duros. Para esto se guarda en un archivo. C.Reveco Facultad de Ingeniería/Universidad de los Andes/Chile ING1310 Clase 17 12 / 28
Definición Un Archivo es un elemento de almacenamiento (y de direccionamiento) de datos. Un archivo F vive en algún Directorio D. D puede estar anidado dentro de otro directorio D2, y así sucesivamente. Toda esta cadena de carpetas se encuentra alojada en alguna unidad de almacenamiento (por ejemplo, el disco duro, C:). A la secuencia de carpetas que contienen a un elemento (sea un archivo u otra carpeta) la llamaremos el Path (ruta) de ese elemento. Dentro de un archivo los datos pueden estar guardados principalmente de dos formas: Archivos ASCII (ejemplo.txt) Archivos binarios (ejemplo.exe,.doc) Nosotros trabajaremos solamente con archivos ASCII. C.Reveco Facultad de Ingeniería/Universidad de los Andes/Chile ING1310 Clase 17 13 / 28
Clase File Para trabajar con archivos en JAVA se debe importar el paquete java.io Sintáxis Java: Paquete import java.io.*;... La clase File representa un archivo. Su constructor recibe como parámetro un String que indica el nombre y ubicación del archivo. Ejemplo: Construcción File archivo = new File (" C:/ Mis Documentos / archivo. txt "); File archivo2 = new File (" archivo. txt "); En el primer caso busca el archivo indicado en la ruta proporcionada. En el segundo caso busca el archivo en la ruta actual. En NetBeans la ruta actual es la carpeta del proyecto. C.Reveco Facultad de Ingeniería/Universidad de los Andes/Chile ING1310 Clase 17 14 / 28
Métodos de File Algunos métodos de esta clase String getname() retorna el nombre del archivo. String getpath() retorna la ruta relativa del archivo. String getabsolutepath() retorna la ruta absoluta del archivo. boolean renameto(file archivo) cambia el nombre del archivo. boolean exists() indica si el archivo existe o no. boolean isfile() indica si el archivo es precisamente un archivo. boolean isdirectory() indica si el archivo es un directorio (carpeta). long length() indica el largo (bytes) del archivo. C.Reveco Facultad de Ingeniería/Universidad de los Andes/Chile ING1310 Clase 17 15 / 28
Archivos Streams C.Reveco Facultad de Ingeniería/Universidad de los Andes/Chile ING1310 Clase 17 16 / 28
Definición La lectura de un archivo se hace viendo a este como un flujo continuo (stream) de bytes. Un stream es una clase que encapsula el acceso secuencial a un conjunto de datos. Se encarga de mantener un índice de la posición actual en la lectura del archivo. De esta manera, si le pido la siguiente ĺınea el stream sabe donde estaba parado, y cual es la siguiente (si existe). En Java encontramos un sin número de clases que hacen las veces de stream. Para archivos utilizaremos FileReader y FileWriter. C.Reveco Facultad de Ingeniería/Universidad de los Andes/Chile ING1310 Clase 17 17 / 28
Archivos Lectura C.Reveco Facultad de Ingeniería/Universidad de los Andes/Chile ING1310 Clase 17 18 / 28
Clase Scanner Para la lectura de archivos lo más simple es utilizar la clase Scanner. Ahora en vez de pasarle como parámetro al constructor la consola, le pasamos un stream de lectura al archivo. Ejemplo: Lectura File archivo = new File (" archivo. txt "); if( archivo. exists ()) { Scanner scan = new Scanner ( new FileReader (" archivo. txt " ));... } Luego se utilizan los mismos métodos que vimos para leer desde la consola. C.Reveco Facultad de Ingeniería/Universidad de los Andes/Chile ING1310 Clase 17 19 / 28
Archivos Escritura C.Reveco Facultad de Ingeniería/Universidad de los Andes/Chile ING1310 Clase 17 20 / 28
Clase FileWriter La clase FileWriter permite escribir datos en un archivo. El constructor recibe un String con el path del archivo. Posee el método void write(string) que escribe la información en el archivo. Este método no salta automáticamente de ĺınea. Ejemplo: Escritura FileWriter fw = new FileWriter (" archivo. txt "); Scanner scan = new Scanner ( System. in ); String texto = scan. next (); while (! texto. equals ("0")) { fw. write ( texto + "\n"); texto = scan. next (); } // Importante cerrar el stream fw. close (); C.Reveco Facultad de Ingeniería/Universidad de los Andes/Chile ING1310 Clase 17 21 / 28
Archivos Excepciones en Archivos C.Reveco Facultad de Ingeniería/Universidad de los Andes/Chile ING1310 Clase 17 22 / 28
Trabajo con Excepciones Dado que el trabajo con archivo es muy propenso a resultar en errores, debemos informar de esto en cada método que trabaje con archivos. Ejemplo: Excepciones public void leer ( String nombre ) throws IOException {... } Si un método llama a otro que trabaje con archivos, también ese método se debe marcar como que lanza excepciones de tipo IOException. De no hacerlo ocurrirá un error en nuestro programa, y no podremos ejecutarlo. C.Reveco Facultad de Ingeniería/Universidad de los Andes/Chile ING1310 Clase 17 23 / 28
Ejemplo C.Reveco Facultad de Ingeniería/Universidad de los Andes/Chile ING1310 Clase 17 24 / 28
Ejemplo Enunciado C.Reveco Facultad de Ingeniería/Universidad de los Andes/Chile ING1310 Clase 17 25 / 28
Ejercicio Archivos: Traspasar ĺıneas Haga una clase Intercambio que en su constructor reciba el nombre de un archivo. Debe tener un método que escriba todas las ĺıneas del archivo original que empiecen con un cierto caracter en un archivo de destino. El método debe recibir el nombre del archivo de destino y el caracter a buscar C.Reveco Facultad de Ingeniería/Universidad de los Andes/Chile ING1310 Clase 17 26 / 28
Ejemplo Solución C.Reveco Facultad de Ingeniería/Universidad de los Andes/Chile ING1310 Clase 17 27 / 28
public class Intercambio { private String ruta ; public Intercambio ( String ruta ) { this. ruta = ruta ; } public void seleccionarlineas ( char caracter, String rutadestino ) throws IOException { File archivo = new File ( ruta ); if( archivo. exists ()) { Scanner lector = new Scanner ( archivo ); FileWriter fw = new FileWriter ( rutadestino ); } } } while ( lector. hasnextline ()) { String linea = lector. nextline (); if( linea. charat (0) == caracter ) fw. write ( linea + "\n"); } fw. close (); C.Reveco Facultad de Ingeniería/Universidad de los Andes/Chile ING1310 Clase 17 28 / 28