Professional Documents
Culture Documents
Clase 10 - Persistencia en Archivos
Clase 10 - Persistencia en Archivos
Program P Program Q
Time Time
1
Persistencia No Volatil
a. Archivos de Texto
Secuenciales
b. Archivos de Texto Aleatorios
c. Archivos Binarios
d. Archivos de Propiedades
e. Bases de Datos
Streams
• Stream: an object that either delivers data to its destination
(screen, file, etc.) or that takes data from a source
(keyboard, file, etc.)
– it acts as a buffer between the data source and
destination
13
Subclases de Reader
• InputStreamReader: convierte un stream de bytes en un stream de chars.
– FileReader: se asocia a files de chars para leerlos.
• BufferedReader: proporciona entrada de caracteres a través de un buffer
(más eficiencia).
Subclases de Writer
• OutputStreamWriter: convierte un stream de bytes en un stream de
chars.
– FileWriter: se asocia a files de chars para modificarlos.
• BufferedWriter: proporciona salida de caracteres a través de un buffer
(más eficiencia).
• PrintWriter: métodos print() y println() para distintos tipos de datos.
14
Típicos Usos de los Streams (lectura por líneas)
public static void main(String[] args) throws IOException {
// 1a. Se lee un file línea a línea
BufferedReader in = new BufferedReader( new FileReader("IOStreamDemo.java"));
String s, s2 = new String();
while((s = in.readLine())!= null)
s2 += s + "\n";
in.close();
// 1b. Se lee una línea por teclado
BufferedReader stdin = new BufferedReader( new InputStreamReader(System.in));
System.out.print("Enter a line:"); System.out.println(stdin.readLine());
}
out2.writeDouble(3.14159);
out2.writeBytes("That was pi\n“);
out2.writeChars( "That was pi\n“);
out2.writeDouble(1.41413);
out2.writeUTF("Square root of 2");
out2.close();
16
Persistencia Posterior - Archivos
• Un computador puede almacenar grandes cantidades de información.
• Puede acceder a ella de manera muy rápida.
• Para hacer cualquier cosa es necesario tener MEMORIA disponible, para
almacenar variables, recordar valores, etc.
• Esta memoria puede ser volátil o persistente.
Datos.txt
Archivos.
Los archivos tienen como finalidad guardar datos de forma permanente. Una
vez que acaba la aplicación los datos almacenados están disponibles para que
otra aplicación pueda recuperarlos para su consulta o modificación.
Secuenciales
Archivos que se leen / escriben línea por línea. Cada línea
puede tener un tamaño en bytes diferente . Los registros se
insertan en el archivo en orden de llegada. Las operaciones
básicas permitidas son: escribir, añadir al final del archivo y
consultar .
Aleatorios
Archivos que se leen / escriben en una línea determinada.
Todas las líneas deben tener la misma cantidad de bytes para
ser recorrida. Un registro es directamente accesible mediante
la especificación de un índice.
Archivos Acceso Secuencial
//constructor de la clase
public Archivo(){
fc=new JFileChooser(System.getProperty("user.dir"));
fc.showOpenDialog(fc);
f=fc.getSelectedFile();
}
public void leer(){
try{
FileInputStream f1 =new FileInputStream(f);
InputStreamReader f2= new InputStreamReader(f1);
BufferedReader linea= new BufferedReader(f2);
if (f.exists()){
System.out.println("El fichero " + f + " existe \nSu contenido es: \n");
String linea_arch=linea.readLine();
while (linea_arch != null) {
System.out.println(linea_arch);
linea_arch = linea.readLine();
}
linea.close();
}
else{System.out.println("archivo no existe");}
}catch(IOException e){ System.out.println("No se pudo leer del archivo"); }
}
public void Escribir(){
try{
InputStreamReader isr= new InputStreamReader(System.in);
BufferedReader linea= new BufferedReader(isr);
System.out.println("Digite la nueva linea: \t");
String linea_arch=linea.readLine();
FileWriter linea_tx= new FileWriter(f,true);
linea_tx.write(linea_arch+"\r\n");
linea_tx.close();
}catch(IOException e){ System.out.print("No se pudo escribir"); }
}
public static void main(String [] args){
Archivo arch=new Archivo();
arch.leer();
arch.Escribir();
} //fin del main
} //fin de la clase
Archivos Acceso Aleatorio
Archivos Acceso Aleatorio
En un archivo secuencial:
María _ _ _ _ _ Reyes 52
José _ _ _ _ _ _ Castro 85
Si hace falta se
debe completar
Como se define el tamaño de un registro?
1 María _ _ _ _ _ Reyes _ _ _ _ _ 52
2 José _ _ _ _ _ _ Castro _ _ _ _ 85
10 Caracteres 10 Caracteres
public ArchivoDirecto() {
this.clave = 0;
this.nombre = "";
this.edad = 0;
this.tamreg = 58;
this.canreg = 0;
try {
fl = new File("C://prueba.dat");
archivo = new RandomAccessFile(fl, "rw");
} catch (FileNotFoundException fnfe) {/* Archivo no encontrado */
}
}
public void escribir() {
BufferedReader teclado = new BufferedReader(new InputStreamReader(System.in));
try {
System.out.println("\nEscribiendo Registros:");
String r = "S";
while (r.equalsIgnoreCase("S")) {
clave++;
System.out.println("Ingrese nombre: ");
nombre = teclado.readLine();
if (nombre.length() < 25) {
for (int i = nombre.length(); i < 25; i++)
nombre = nombre + " ";
} else {nombre = nombre.substring(0, 25);}
System.out.println("Ingrese edad: ");
edad = Integer.parseInt(teclado.readLine());
if (archivo.length()!= 0) {
archivo.seek(archivo.length());
}
archivo.writeInt(clave);
archivo.writeChars(nombre);
archivo.writeInt(edad);
System.out.println("Ingresar otra linea (S or N)?: \t");
r = teclado.readLine();
}
} catch (FileNotFoundException fnfe) {/* Archivo no encontrado */
} catch (IOException ioe) { /* Error al escribir */}
}
public void leerTodo() {
System.out.println("\nMostrando todos los Registros");
try {
archivo.seek(0);
nombre = "";
canreg = archivo.length() / tamreg;
for (int r = 0; r < canreg; r++) {
clave = archivo.readInt();
for (int i = 0; i < 25; ++i) {
nombre += archivo.readChar();
}
edad = archivo.readInt();
System.out.println(" Registro No: " + clave + " Nombre: "
+ nombre + " Edad: " + edad);
nombre = "";
}
} catch (FileNotFoundException fnfe) {/* Archivo no encontrado */
} catch (IOException ioe) { /* Error al escribir */}
}
public void cerrar() {
try {
archivo.close();
} catch (IOException e) {e.printStackTrace();}
}
http://www.tecn.upf.es/~bouayad/prog/material/teoria/collections/collections.pdf
http://mit.ocw.universia.net/6.170/6.170/f01/pdf/lecture-16.pdf