Java - Ayuda para leer archivo

 
Vista:
sin imagen de perfil

Ayuda para leer archivo

Publicado por Ana (21 intervenciones) el 20/08/2021 16:29:35
Buenas. Quería saber si alguien me podría decir cómo hacer para leer un archivo de objetos con fileinputstream.

Muchas gracias
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Kabuto
Val: 3.428
Oro
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Ayuda para leer archivo

Publicado por Kabuto (1381 intervenciones) el 20/08/2021 20:28:24
Solo con FileInputStream, no podrás leer archivos de objetos.

FileInput hace una lectura de los bytes de un archivo, pero nada más, no interpreta el significado de esos bytes.

Para leer archivos de objetos, hay que usar ObjectInputStream, quien se sirve de FileInputStream para leer los bytes y luego él los transforma en un Object.
Después ese Object, lo transformamos a la clase que pertenezca: Persona, Alumno, un array de enteros, etc...

Veamos un ejemplo. Pongamos esta sencilla clase Persona
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import java.io.Serializable;
 
public class Persona implements Serializable{
 
	private String nombre;
 
	public Persona(String nombre) {
		this.nombre = nombre;
	}
 
	@Override
	public String toString() {
		return "Me llamo " + nombre;
	}
 
}

Fíjate que implementa la interfaz Serializable. Esto es necesario para poder luego crear un archivo de objetos.

Y a continuación ejecutamos el siguiente programa, donde creamos una Persona y la guardamos en disco, usando un ObjectOutputStream (junto con un FileOutputStream)

Una vez guardado en disco, creamos una nueva Persona, pero esta vez leyendo el objeto guardado en disco, usando un ObjectInputStream (junto con un FileInputStream)

Una vez recuperada esta Persona, la mostraremos en pantalla para comprobar que la hemos recuperado correctamente.

Fíjate que tanto para leer como escribir, se requiere usar obligatoriamente try catch. Esto siempre es obligatorio para cualquier operación que implique leer/escribir en disco.
El código tiene comentarios explicando cada paso, si algo no lo entiendes, pregunta. Un saludo.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
mport java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
 
public class EjemploObject {
 
	public static void main(String[] args) {
 
		//Creamos una Persona
		Persona personaEscrita = new Persona("Federico");
 
		//La guardamos como objeto en disco
		try {
			//Creamos el "escritor" dandole el nombre con el que crear archivo
			ObjectOutputStream escritor = new ObjectOutputStream(new FileOutputStream("persona.bin"));
			//Escribimos la Persona
			escritor.writeObject(personaEscrita);
			escritor.close();
		} catch (Exception e) {
			System.out.println("Algo salió mal:\n" + e.getMessage());
		}
 
		//Ahora, la recuperaremos del disco
		try {
			//Creamos el "lector", indicándole que archivo ha de leer
			ObjectInputStream lector = new ObjectInputStream(new FileInputStream("persona.bin"));
			//Leemos la persona, la lectura devuelve un Object, por lo que hay castear a Persona
			Persona personaLeida = (Persona) lector.readObject();
			lector.close();
			//Comprobamos que hemos recuperado a la persona correctamente mostrándola en pantalla
			System.out.println(personaLeida);
		} catch (Exception e) {
			System.out.println("Algo salió mal:\n" + e.getMessage());
		}
 
	}
 
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Ayuda para leer archivo

Publicado por Ana (21 intervenciones) el 20/08/2021 23:47:49
Muchas gracias. Ese código es para leer un solo objeto? Cómo hago para leer si tengo más de un objeto?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Kabuto
Val: 3.428
Oro
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Ayuda para leer archivo

Publicado por Kabuto (1381 intervenciones) el 21/08/2021 00:48:18
Si tienes más de un objeto, se supone que los tendrás en un arreglo, o en un ArrayList, o en cualquier otra colección de las que ofrece Java.
Entonces, lo que lees/guardas en disco como objeto, es esa colección.

Te dejo un ejemplo con un arreglo de Personas, que apenas varía del código anterior.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
public class EjemploObject {
 
	public static void main(String[] args) {
 
		//Creamos array de Personas
		Persona[] personasEscritas = new Persona[] {
				new Persona("Federico"), new Persona("Susana"), new Persona("Diego")
		};
 
		//Guardamos como objeto en disco
		try {
			//Creamos el "escritor" dandole el nombre con el que crear archivo
			ObjectOutputStream escritor = new ObjectOutputStream(new FileOutputStream("personas.bin"));
			//Escribimos el array  Persona
			escritor.writeObject(personasEscritas);
			escritor.close();
		} catch (Exception e) {
			System.out.println("Algo salió mal:\n" + e.getMessage());
		}
 
		//Ahora, recuperamos las Personas del disco
		try {
			//Creamos el "lector", indicándole que archivo ha de leer
			ObjectInputStream lector = new ObjectInputStream(new FileInputStream("personas.bin"));
			//Leemos el array, la lectura devuelve un Object, por lo que hay castear a array de Persona
			Persona[] personasLeidas = (Persona[]) lector.readObject();
			lector.close();
			//Comprobamos que hemos recuperado todas las personas, mostrándolas en pantalla
			for (Persona pers: personasLeidas)
				System.out.println(pers);
		} catch (Exception e) {
			System.out.println("Algo salió mal:\n" + e.getMessage());
		}
 
	}
 
}

En pantalla veremos que hemos recuperado todos los objetos Persona:
1
2
3
Me llamo Federico
Me llamo Susana
Me llamo Diego
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Ayuda para leer archivo

Publicado por Ana (21 intervenciones) el 21/08/2021 03:35:34
Ah claro. Lo que pasa es que no tengo los objetos en un array. Los voy agregando uno por uno al archivo. Estoy usando serializable
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Kabuto
Val: 3.428
Oro
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Ayuda para leer archivo

Publicado por Kabuto (1381 intervenciones) el 21/08/2021 11:58:31
Entiendo.
La verdad es que yo nunca lo he hecho como dices, siempre trabajo con un arreglo o un ArrayList, y son estos los que escribo en un archivo.
Así, con un único objeto, en realidad estoy guardando todos los que necesite.

Pero sí se puede hacer. Cuando leemos con readObject(), cada lectura nos devuelve un objeto. Cuando ya no quedan, nos devuelve valor null
Así que podemos hacer un bucle que se repita mientras nos devuelva objetos distinto de null

Algo parecido a esto:

1
2
3
4
5
6
7
8
9
10
11
Object objeto = lector.readObject();
 
while (objeto != null) {
        //Casteamos a Persona
        Persona pers = (Persona) objeto;
        //Hacemos lo que necesitemos con esta persona.
        System.out.println(pers);
        //Pedimos lectura del siguiente objeto, si es que aún quedan
        objeto = lector.readObject();
}
//Terminado el bucle while, ya hemos leído TODOS los objetos

Lo de ir añadiendo objetos por separado a un mismo archivo, se que puede presentar algunos problemas.
Cada vez que se instancia el "escritor", es decir, el ObjectOutputStream, se crea una cabecera (header) en el archivo.

Entonces, si se instancia una sola vez, y se utiliza esa misma instancia a lo largo del programa para escribir objetos, no hay problema.

Pero, si cada vez que queramos escribir un objeto, hacemos una nueva instancia del "escritor", añadirá una nueva cabecera al archivo.
Esto es un problema, porque luego el "lector" al encontrarse cabeceras insertadas entre los objetos, piensa que son datos corruptos y no seguirá leyendo.

Así que hay que tener cuidado con eso.

En este artículo se explica esto (Problema 2) e incluso propone una solución para evitarlo.


Pero vamos, mi recomendación es usar colecciones de datos para no tener que añadir nuevos objetos a un mismo archivo, si no sobrescribir siempre un único objeto (la colección de objetos)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar