Post on 24-Jan-2021
Ing. Roberto Martínez Román -rmroman@itesm.mx 1
ArchivosGUARDANDO Y RECUPERANDO INFORMACIÓN EN JAVA
ING. ROBERTO MARTÍNEZ ROMÁN -RMROMAN@ITESM.MX
1
Flujos de datos
ING. ROBERTO MARTÍNEZ ROMÁN -RMROMAN@ITESM.MX
Los programas pueden leer/escribir datos desde distintos dispositivos del sistema
Flujo de entrada
Flujo de Salida
2
Ing. Roberto Martínez Román -rmroman@itesm.mx 2
Entrada/Salida en consola
ING. ROBERTO MARTÍNEZ ROMÁN -RMROMAN@ITESM.MX
Existen 3 flujos predefinidos para leer/escribir en consola.
System.in. Flujo de entrada estándar
System.out. Flujo de salida estándar
System.err. Flujo de errores estándar
3
La clase ScannerSe utiliza para leer datos desde la consola de entrada (teclado, System.in).
Scanner teclado = new Scanner(System.in);
nombre = teclado.nextLine(); // lee una cadena
edad = teclado.nextInt(); // lee un entero
estatura = teclado.nextDouble(); // lee un número real
casado = teclado.nextBoolean(); // lee un valor lógico
ING. ROBERTO MARTÍNEZ ROMÁN - RMROMAN@ITESM.MX
4
Ing. Roberto Martínez Román -rmroman@itesm.mx 3
EjercicioEscribe un programa que lea los datos de una persona: nombre, edad, estatura y si está casado o no.
ING. ROBERTO MARTÍNEZ ROMÁN - RMROMAN@ITESM.MX
5
Archivos de entrada
ING. ROBERTO MARTÍNEZ ROMÁN -RMROMAN@ITESM.MX
FileReader ent = new FileReader("nombre.txt");
La clase FileReader define métodos básicos de lectura de caracteres.
BufferedReader entrada = new BufferedReader( ent );
La clase BufferedReader define métodos para leer caracteres, arreglos de caracteres o líneas de texto.
6
Ing. Roberto Martínez Román -rmroman@itesm.mx 4
Leyendo datos del archivo
ING. ROBERTO MARTÍNEZ ROMÁN -RMROMAN@ITESM.MX
BufferedReader entrada = new BufferedReader(new FileReader("datos.txt"));
String linea = entrada.readLine();
El método readLine lee caracteres del flujo de entrada hasta encontrar una nueva línea '\n'. Si no hay datos para leer, regresa null.
entrada.close();
El método close cierra el flujo, libera el recurso asignado por el sistema operativo.
7
Leyendo datos del archivo
ING. ROBERTO MARTÍNEZ ROMÁN -RMROMAN@ITESM.MX
BufferedReader entrada = new BufferedReader(new FileReader("datos.txt"));
while ( entrada.ready() ) {
String linea = entrada.readLine();
// Procesa línea
}
entrada.close();
8
Ing. Roberto Martínez Román -rmroman@itesm.mx 5
Excepciones usando archivos
ING. ROBERTO MARTÍNEZ ROMÁN -RMROMAN@ITESM.MX
Los métodos utilizados para crear y usar archivos lanzan excepciones de tipo IOException, las cuales son verificadas.
Los métodos que usan estas operaciones, deben tener una instrucción try-catch o indicar que la excepción es ignorada. (throws)
Consulta el API para conocer los diferentes tipos de excepciones que generan las operaciones con archivos.
9
Ejemplo
ING. ROBERTO MARTÍNEZ ROMÁN -RMROMAN@ITESM.MX
Escribe código para abrir un archivo de entrada (texto) e imprimir su contenido en un componente gráfico.
Agregue a su ejercicio, código para numerar cada línea.
10
Ing. Roberto Martínez Román -rmroman@itesm.mx 6
1: import java.io.BufferedReader;2: import java.io.IOException;3: import java.io.FileReader;4: 5: public class PruebaArchivos 6: {7: public static void main(String[] args) throws IOException {8: 9: BufferedReader entrada = new BufferedReader(new FileReader("PruebaArchivos.java"));10: int numLinea=0;11: while ( entrada.ready() ) {12: 13: String linea = entrada.readLine();14: numLinea++;15: System.out.println(numLinea + ": " + linea);16: }17: 18: entrada.close();19: }20: }
Solución (para consola)BufferedReader entrada = new BufferedReader(new FileReader("PruebaArchivos.java"));
int numLinea=0;while ( entrada.ready() ) {
String linea = entrada.readLine();
numLinea++;
System.out.println(numLinea + ": " + linea);
}
entrada.close();
ING. ROBERTO MARTÍNEZ ROMÁN -RMROMAN@ITESM.MX
11
Procesando palabras de un archivo de texto
ING. ROBERTO MARTÍNEZ ROMÁN -RMROMAN@ITESM.MX
La clase StringTokenizer proporciona la funcionalidad de descomponer un String en componentes llamados tokens.
StringTokenizer st = new StringTokenizer(línea); // Separador " ", por default
StringTokenizer st = new StringTokenizer(línea,separador); // Podemos indicar el separador con un String
while ( st.hasMoreTokens() ) {
String palabra = st.nextToken();
// Procesa la palabra
}
12
Ing. Roberto Martínez Román -rmroman@itesm.mx 7
Procesando palabras de un archivo de texto
ING. ROBERTO MARTÍNEZ ROMÁN -RMROMAN@ITESM.MX
La clase String proporciona el método split que ayuda a descomponer un String en componentes llamados tokens.
String a = "Hola mundo adios x335!-sf";String b[] = a.split(" ");System.out.println(Arrays.toString(b));
[Hola, mundo, adios, x335!-sf]
13
Ejemplo
Clave Existencia100-A253-C290-A315-D
35722948
ING. ROBERTO MARTÍNEZ ROMÁN -RMROMAN@ITESM.MX
Dado un archivo de texto con datos de clave de producto y existencia, escriba código para calcular el total de productos en existencia. Los datos en cada línea están separados por un tabulador. (No sabemos el número de líneas que hay en el archivo)
14
Ing. Roberto Martínez Román -rmroman@itesm.mx 8
Archivos de salida
ING. ROBERTO MARTÍNEZ ROMÁN -RMROMAN@ITESM.MX
Para definir un archivo de salida, creamos un objeto de tipo PrintWriter.
PrintWriter salida = new PrintWriter(new FileWriter("datos.txt"));
El objeto salida se procesa como si usáramos System.out (print y println)
15
Archivos de salida
ING. ROBERTO MARTÍNEZ ROMÁN -RMROMAN@ITESM.MX
Si el archivo ya existe, normalmente se destruye y se crea uno nuevo. Para evitar que se borren los datos existentes, se usa el siguiente formato:
PrintWriter salida = new PrintWriter(new FileWriter("datos.txt", true));
16
Ing. Roberto Martínez Román -rmroman@itesm.mx 9
Escribiendo datos al archivo
ING. ROBERTO MARTÍNEZ ROMÁN -RMROMAN@ITESM.MX
PrintWriter salida = new PrintWriter(new FileWriter("datos.txt"));
salida.println("Datos al archivo");
salida.println("Otros\nDatos");
salida.println("Edad: " + edad);
salida.printf("Estatura: %.2f", est);
salida.close();
17
Implementa las siguientes clases
ING. ROBERTO MARTÍNEZ ROMÁN - RMROMAN@ITESM.MX
<<interface>>ILector
+ decodificar(String archivo): String+ codificar(String archivo, mensaje:String): void
Lector
+ decodificar(String archivo): String+ codificar(String archivo, mensaje:String): void
CambiaLetra
+ cambiar(letra: Character) Character
Cambia algunas letras por númerosa - 9e - 3j - 1z - 2h - 4s - 5g - 6t - 7b - 8o - 0
18
Ing. Roberto Martínez Román -rmroman@itesm.mx 10
Ejemplo
ING. ROBERTO MARTÍNEZ ROMÁN -RMROMAN@ITESM.MX
Escriba código para generar un archivo de salida de texto que contenga 20 números aleatorios entre 10 y 100.
Agrega 20 números más al archivo generado.
19
SoluciónPrintWriter salida = new PrintWriter(new FileWriter("datos.txt"));
for(int i=1; i<=20; i++) {
salida.println( (int)(Math.random()*100)+1 );
}
salida.close();
ING. ROBERTO MARTÍNEZ ROMÁN -RMROMAN@ITESM.MX
201235689033828846655449056983479888688
20
Ing. Roberto Martínez Román -rmroman@itesm.mx 11
SoluciónPrintWriter salida = new PrintWriter(new FileWriter("datos.txt",true));
for(int i=1; i<=20; i++) {
salida.println( (int)(Math.random()*100)+1 );
}
salida.close();
ING. ROBERTO MARTÍNEZ ROMÁN -RMROMAN@ITESM.MX
20123568903382884665544905698347988868870546471979056811636147159265208982659
21
Leyendo archivos, con la clase Scanner
ING. ROBERTO MARTÍNEZ ROMÁN -RMROMAN@ITESM.MX
Scanner sc = new Scanner(new FileReader("hola.txt"));
while ( sc.hasNextLine() ) {
System.out.println("Línea: " + sc.nextLine());
}
22
Ing. Roberto Martínez Román -rmroman@itesm.mx 12
Para leer datos individuales
ING. ROBERTO MARTÍNEZ ROMÁN -RMROMAN@ITESM.MX
Scanner sc = new Scanner(new FileReader("hola.txt"));
while ( sc.hasNext() ) {
String nombre = sc.next();
int c1 = sc.nextInt();
int c2 = sc.nextInt();
}
Roberto 100 90Margarito 80 75
23
Ejemplo usando Scanner
Clave Existencia100-A253-C290-A315-D
35722948
ING. ROBERTO MARTÍNEZ ROMÁN -RMROMAN@ITESM.MX
Dado un archivo de texto con datos de clave de producto y existencia, escriba código para calcular el total de productos en existencia. Los datos en cada línea están separados por un tabulador. (No sabemos el número de líneas que hay en el archivo)
24