Java: serializando objetos para guardar y recuperar en ficheros (editado)

2017-05-01 - Categorías: Java
Logo de Java

Desenpolvando un poco temas de Java, hoy traigo un pequeño HOWTO para guardar datos en ficheros sin complicarnos demasiado la vida. Normalmente trabajaremos sobre una base de datos cuando tenemos muchos datos. Es decir, cuando tenemos programas que gestionen sistemas de información. Pero a veces, necesitamos algo rápido para guardar en ficheros.

Así que aquí un pequeño código que usa la interfaz Serializable. Simplemente, el objeto que implementa esta interfaz, será fácilmente guardable como fichero de texto.

El código

Marco en negrita los códigos que hacen que un objeto se haga serializable. Aquí se almacenan dichos objetos en un array, así lo que se guarda es el array y de una tacada se guardan todos los objetos que haya. De igual forma se recuperan del disco para comprobar qué tal se han guardado:

import java.util.ArrayList;
import java.io.ObjectOutputStream;
import java.io.ObjectInputStream;
import java.io.FileOutputStream;
import java.io.FileInputStream;
import java.io.Serializable;

public class Serializando {
    @SuppressWarnings({ "unchecked" })
    public static void main(String[] arg) {

        ArrayList <Objeto> arrayList1 = new ArrayList <Objeto>();
        ArrayList <Objeto> arrayList2;

        System.out.println("Datos que vamos a escribir en el fichero:");
        for(int i = 0; i < 10; i++) {
            Objeto nuevoObjeto = new Objeto("Cadena" + i);
            arrayList1.add(nuevoObjeto);
            System.out.println( "arrayList1[" + i + "] = " + arrayList1.get(i) );
        }

        try {
            System.out.print("Guardando ArrayList en el fichero objetos.dat.. ");

            ObjectOutputStream escribiendoFichero = new ObjectOutputStream( 
            new FileOutputStream("objetos.dat") );
            escribiendoFichero.writeObject(arrayList1);
            escribiendoFichero.close();

            System.out.println("ok!");
            System.out.print("Leyendo ArrayList del fichero objetos.dat.. ");

            ObjectInputStream leyendoFichero = new ObjectInputStream( 
            new FileInputStream("objetos.dat") );
            arrayList2 = ( ArrayList <Objeto> )leyendoFichero.readObject();
            leyendoFichero.close();

            System.out.println("ok!");
            System.out.println("Datos leídos del fichero:");

            for(int i = 0; i < arrayList2.size(); i++) {
                System.out.println( "arrayList2[" + i + "] = " + arrayList2.get(i) );
            }
        } catch (Exception e) {
            System.out.println( e.getMessage() );
        }

    }

}

class Objeto implements Serializable {
    private String _dato;

    public Objeto (String dato) {
        this._dato = dato;
    }

    public String toString() {
        return this._dato;
    }
}

Ejecutando

Ahora para ejecutarlo tenemos que ejecutar desde línea de comandos lo siguiente:

$ javac Serializando.java
$ java Serializando

Si todo ha ido bien tenemos que ver en pantalla lo siguiente:

Datos que vamos a escribir en el fichero:
arrayList1[0] = Cadena0
arrayList1[1] = Cadena1
arrayList1[2] = Cadena2
arrayList1[3] = Cadena3
arrayList1[4] = Cadena4
arrayList1[5] = Cadena5
arrayList1[6] = Cadena6
arrayList1[7] = Cadena7
arrayList1[8] = Cadena8
arrayList1[9] = Cadena9
Guardando ArrayList en el fichero objetos.dat.. ok!
Leyendo ArrayList del fichero objetos.dat.. ok!
Datos leídos del fichero:
arrayList2[0] = Cadena0
arrayList2[1] = Cadena1
arrayList2[2] = Cadena2
arrayList2[3] = Cadena3
arrayList2[4] = Cadena4
arrayList2[5] = Cadena5
arrayList2[6] = Cadena6
arrayList2[7] = Cadena7
arrayList2[8] = Cadena8
arrayList2[9] = Cadena9

Ya está no tiene más historia. Espero que sirva. ¡Un saludo!

12 respuestas a “Java: serializando objetos para guardar y recuperar en ficheros (editado)”

  1. Merelyn R. dice:

    Muy útil. Llevo varias horas tratando de encontrar la forma de guardar dinámicamente objetos en mi fichero y poder leerlos todos, y lo logré hasta ahora con ayuda de este código. Muchísimas gracias!

  2. Adriana dice:

    Hola, deseo realizar que un programa pueda un usuario baje un PDF individual y lo guarde en su PC, . Vos me puedes ayudar en eso??

    Mb tu propuesta por eso te escribo.

    Gracias.

    • Jnj dice:

      Hola Adriana.
      No acabo de entender bien la especificación de tu comentario. Pero gracias por dejar un comentario. Y he encontrado éste código fuente en Java que te podría ayudar:

      try (BufferedInputStream inputStream = new BufferedInputStream(new URL(«http://www.dominiodelaweb.com/nombre-fichero.pdf»).openStream());
      FileOutputStream fileOS = new FileOutputStream(«/Users/username/Documents/nombre-fichero.pdf»)) {
      byte data[] = new byte[1024];
      int byteContent;
      while ((byteContent = inputStream.read(data, 0, 1024)) != -1) {
      fileOS.write(data, 0, byteContent);
      }
      } catch (IOException e) {
      // handles IO exceptions
      }

      ..lo he sacado de https://stackabuse.com/how-to-download-a-file-from-a-url-in-java/. Espero que sirva.
      Un saludo!

  3. Jose dice:

    Y como se haría para cargar ese mismo archivo de datos en el arraylist1

    • Jnj dice:

      En la parte donde se carga en arrayList2 lo tienes. Sería lo mismo pero poniendo arrayList1.
      Un saludo José.

      • Jose dice:

        Que va tengo un código como este y no me deja.

        El arraylist que guardo y cargo es este.

        ArrayList Usuarios = new ArrayList();

        case 4:
        System.out.print(«Guardando datos en el fichero datos.dat.. «);

        ObjectOutputStream escribiendoFichero = new ObjectOutputStream(new FileOutputStream(«datos.dat»));
        escribiendoFichero.writeObject(Usuarios);
        escribiendoFichero.close();

        System.out.println(«Datos Guardados con exito!»);

        break;
        case 5:
        System.out.print(«Leyendo ArrayList del fichero datos.dat.. «);

        ObjectInputStream leyendoFichero = new ObjectInputStream(new FileInputStream(«datos.dat»));
        Usuarios = (ArrayList) leyendoFichero.readObject(); //En esta línea me da error el codigo
        leyendoFichero.close();

        System.out.println(«ok!»);
        System.out.println(«Datos leídos del fichero:»);
        break;

        • Jnj dice:

          Creo que falla porque no has declarado el tipo de objeto que guardas en la lista, ni luego al cargarlo desde fichero el casting de lo que lees:
          ..
          ArrayList <Usuario> usuarios = new ArrayList <Usuario>();
          ..
          escribiendoFichero.writeObject(usuarios);
          ..
          usuarios = ( ArrayList <Usuario> ) leyendoFichero.readObject();
          ..
          Un saludo José.

  4. Pipe dice:

    Como haría para cargar un archivo.dat ya serializado en una Jtable y también guardar los elementos que ya se agregaron a la Jtable en un archivo.dat ya serializado??

  5. Lauro Jimenez dice:

    Yo obtengo un error que no me deja correr el programa, es el siguiente…..

    local class incompatible: stream classdesc serialVersionUID = 6529685098267757690, local class serialVersionUID = 8603723807187381908

Responder a Jnj Cancelar la respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

 

© 2021 JnjSite.com - MIT license

Sitio hecho con WordPress, diseño y programación del tema por Jnj.