[ Foro de Java ]
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) {
}
}
}
}
Los objetos son siempre distintos entre ellos. Deberías comparar su contenido (valor de los atributos)
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.
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.
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.)