[ Foro de Java ]

evitar duplicados al escribir y leer desde fichero

08-May-2021 12:20
Invitado (Murphy)
4 Respuestas

Buenas, en el siguiente código estoy intentado mediante dos métodos escribir y leer clientes que almaceno en archivo, pero a pesar de que uso un HashSet lo clientes se me duplican. ¿Alguna idea de dónde está mi error? Gracias de antemano


public static void EscribirFichero(Cliente cl) {



   ObjectOutputStream objectOutput = null;

   ObjectInputStream objectInput = null;

   HashSet<Cliente> cliHS = new HashSet<Cliente>();





   try {

       if(FILE_NAME.exists()) {

           objectInput = new ObjectInputStream(new FileInputStream(FILE_NAME));

           cliHS = (HashSet<Cliente>) objectInput.readObject();

       }



       cliHS.add(cl);



       objectOutput = new ObjectOutputStream(new FileOutputStream(FILE_NAME)); /// true

       objectOutput.writeObject(cliHS);



       System.out.println("Se ha generado el fichero " + FILE_NAME);



   } catch (FileNotFoundException e) {

       e.printStackTrace();

   } catch (IOException e) {

       e.printStackTrace();

   } catch (ClassNotFoundException e) {

       e.printStackTrace();

   } finally {

       if (objectOutput != null) {

           try {

               objectOutput.close();

           } catch (IOException ignored) {

           }

       }

   }

}



public static void LeerFichero() {

   ObjectInputStream objectInput = null;



   try {

       objectInput = new ObjectInputStream(new FileInputStream(FILE_NAME));



       Object actual = null;

       HashSet<Cliente> cliHS = null;

       while((actual = objectInput.readObject()) != null) {

           cliHS = (HashSet<Cliente>) actual;

           Iterator it = cliHS.iterator();

           while(it.hasNext()) {

            System.out.println("Datos cliente: "+it.next());

           }



       }



       objectInput.close();

   } catch (FileNotFoundException e) {

       e.printStackTrace();

   } catch(EOFException e) {



   } catch (IOException e) {

       e.printStackTrace();

   } catch (ClassNotFoundException e) {

       e.printStackTrace();

   } finally {

       if (objectInput != null) {

           try {

               objectInput.close();

           } catch (IOException ignored) {

           }

       }

   }

}


08-May-2021 21:00
Nacho Cabanes (+83)

Los objetos son siempre distintos entre ellos. Deberías comparar su contenido (valor de los atributos)


09-May-2021 11:35
Invitado (Murphy)

Gracias por la respuesta, pero no es necesario comparar en un HashSet, ya que esta estructura no permite duplicados. También probé con un ArrayList y en este caso comparando como bien dices, pero tampoco funciona porque lo que creo que se repite en realidad son estructuras como la del HashSet. Cada vez que grabo un cliente se debe de estar haciendo en un HashSet nuevo y luego lo que listo son varios HashSet, de ahí que se repitan nombres de cliente.


13-May-2021 15:35
Invitado (Xeros)

Mmm raro... No lo probe a tu codigo, lo estoy leyendo.

De ultima arreglalo con un else:
if(FILE_NAME.exists()) { // Si existe es verdadero

          objectInput = new ObjectInputStream(new FileInputStream(FILE_NAME));

          cliHS = (HashSet<Cliente>) objectInput.readObject();

      }
else // Si existe es falso
{
      cliHS.add(cl);
}


------------------------
De esta forma creo que te ahorras el problema de que te lo duplique, pero es cierto... te esta agregando un objeto duplicado al hash...

Espero que funcione, como dije no probe tu codigo y solo lo estoy leyendo... Pero yo probaria eso, para ver si se soluciona.


15-Jun-2021 19:40
Franco Garcia

Para que el HashSet NO DUPLIQUE datos, le TENES que decir QUE DATOS/CAMPOS queres que compare.

PARA LOGRARLO tenes que sobreescribir (@Override) los metodos  "equals()" y "hashCode()", porque esos son los métodos que usa internamente un HashSet para comparar que un objeto no sea igual a otro.

Para que se entienda, si yo CREO una clase Persona en la cual no quiero que se repita el nro de Documento de una persona, Java NO TIENE FORMA de saber hacer esa comparación. Para eso, hay que decirle QUE  CAMPOS y COMO los debe comparar, para evitar duplicados.

eclipse y otros entornos de desarrollo suelen tener la opción de generar estos métodos, para ahorrarte tiempo de escritura, puesto que son métodos que se usan mucho. Caso contrario, podes googlear como crearlos y tendras que adaptarlo, para que compare a tus Clientes.

SLDS y espero haberte ayudado.






(No se puede continuar esta discusión porque tiene más de dos meses de antigüedad. Si tienes dudas parecidas, abre un nuevo hilo.)