guardar objecto en fichero

Iniciado por betikano, 18 Mayo 2014, 19:20 PM

0 Miembros y 2 Visitantes están viendo este tema.

betikano

Hola, se puede guardar un objecto en un fichero sin utilizar los metodos serializacion? ya que si los guardo con

BufferedWriter Fescribe=new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file,true), "utf-8"));

el resultado en el archivo es:

DirectoryPackage.DirectoryPRAC5@128c5c03

cuando yo he guardado un Objecto del tipo: Apellido1,Apellido2,Nombre

gracias de antemano.

juanxo1988

Hola Betikano,

Creo que para que un objeto pueda ser almacenado en disco duro, en un fichero por ejemplo, se ha de implementar la interfaz serializable por narices. Al menos es el único método que he usado yo por ahora para trabajar con objetos en ficheros.

Aquí te paso un link:
http://www.chuidiang.com/java/ficheros/ObjetosFichero.php

betikano

Cita de: juanxo1988 en 18 Mayo 2014, 19:55 PM
Hola Betikano,

Creo que para que un objeto pueda ser almacenado en disco duro, en un fichero por ejemplo, se ha de implementar la interfaz serializable por narices. Al menos es el único método que he usado yo por ahora para trabajar con objetos en ficheros.

Aquí te paso un link:
http://www.chuidiang.com/java/ficheros/ObjetosFichero.php

En principio no puedo implementar nada mas ya que me dan la clase predefinida:

public class DirectoryPRAC5 implements Directory {
...
...
}

y para hacer la carga y descarga no puedo utilizar mecanismos de serialización.

public static DirectoryPRAC5 load(File file) {} //metodo cargar
public static boolean save(File file, DirectoryPRAC5 directory) {} //metodo descargar/guardar

Chuidiang

Echa un ojo a esta librería GSON https://code.google.com/p/google-gson/

Es capaz de convertir un objeto java en un string json y viceversa, puede ser una alternativa a guardar y recuperar objetos de un fichero. Basta con convertir el objeto a string json y guardarlo en el fichero.

Otra opción es hacerlo a mano, guardando en un formto que te inventes cada objeto, atributo a atributo.

Se bueno.

betikano

Cita de: Chuidiang en 19 Mayo 2014, 00:00 AM
Echa un ojo a esta librería GSON https://code.google.com/p/google-gson/

Es capaz de convertir un objeto java en un string json y viceversa, puede ser una alternativa a guardar y recuperar objetos de un fichero. Basta con convertir el objeto a string json y guardarlo en el fichero.

Otra opción es hacerlo a mano, guardando en un formto que te inventes cada objeto, atributo a atributo.

Se bueno.

Cita de: juanxo1988 en 18 Mayo 2014, 19:55 PM
Hola Betikano,

Creo que para que un objeto pueda ser almacenado en disco duro, en un fichero por ejemplo, se ha de implementar la interfaz serializable por narices. Al menos es el único método que he usado yo por ahora para trabajar con objetos en ficheros.

Aquí te paso un link:
http://www.chuidiang.com/java/ficheros/ObjetosFichero.php

Aclarado el tema, no puedo utlizar ninguna otra interfaz ni metodo que trate con objectos.

Me dan un almacen de objetos de la clase DirectoryItem y tengo que hacer la carga y descarga con :

public static DirectoryPRAC5 load(File file) {

DirectoryPRAC5 resultat = new DirectoryPRAC5();

....
...
...
return resultat;
}

public static boolean save(File file, DirectoryPRAC5 directory) { }

el problema que tengo es que al hacer el metodo save me guarda en el archivo DirectoryPackage.DirectoryPRAC5@76c511b y no el contenido del directorio por ejemplo:

Antonio
Lopez
Castillo
980987234
antonio@gmail.com


la classe DirectoryItem es:

public class DirectoryItem implements Comparable {

private String name, surname1, surname2;
private Set<Long> telephones;
private Set<String> emails;

public DirectoryItem (String name, String surname1) {

if (name==null || surname1==null)
    throw new IllegalArgumentException("null values not admitted");
if (name.trim().equals("") || surname1.trim().equals(""))
    throw new IllegalArgumentException("empty or blank strings not admitted");

this.name=name.toUpperCase();
this.surname1=surname1.toUpperCase();
this.surname2=null;
this.telephones = new TreeSet<Long>();
this.emails = new TreeSet<String>();
}

public DirectoryItem (String name, String surname1, String surname2) {

this(name, surname1);
if (surname2!=null) {
if (surname2.trim().equals(""))
   throw new IllegalArgumentException("empty or blank strings not admitted");
this.surname2 = surname2.toUpperCase(); }
}
...
// beware, these get methods return a copy not the attributes themselves
public Collection<Long> getTelephones () {return new TreeSet(this.telephones);} public Collection<String> getEmails () {return new TreeSet(this.emails);}

...

protected boolean addTelephone(long telephone) {
// ull! wrapping automatic de telefon (de long a Long)

return this.telephones.add(telephone);
}

protected boolean addEmail (String email) {
    return this.emails.add(email);
}
protected boolean removeTelephone (long telephone) { return this.telephones.remove(telephone);
}
protected boolean removeEmail (String email) { return this.emails.remove(email);
}
...

Chuidiang

Hola:

¿Y como haces el save?.

Lo que estás guardando es la "dirección de memoria" (aunque en java dicen que no existe) donde está almacenado el objeto y que es lo que devuelve por defecto el método toString() de Object.

Si no puedes usar una librería adicional como gson que no interfiere en absoluto con tu objeto ni las interfaces para salvarlo, no te queda más remedio que ir llamando uno a uno a todos los métodos get de tu clase hasta obtener tipos "primitivos" como int, String, double, boolean, y guardar uno a uno todos ellos.

Se bueno.

betikano

Cita de: Chuidiang en 19 Mayo 2014, 20:53 PM
Hola:

¿Y como haces el save?.

Lo que estás guardando es la "dirección de memoria" (aunque en java dicen que no existe) donde está almacenado el objeto y que es lo que devuelve por defecto el método toString() de Object.

Si no puedes usar una librería adicional como gson que no interfiere en absoluto con tu objeto ni las interfaces para salvarlo, no te queda más remedio que ir llamando uno a uno a todos los métodos get de tu clase hasta obtener tipos "primitivos" como int, String, double, boolean, y guardar uno a uno todos ellos.

Se bueno.

    public static boolean save(File file, DirectoryPRAC5 directory) {

BufferedWriter Fescribe=new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file,true), "utf-8")); 
         
              Fescribe.write(directory + "\r\n"); 
             
              //Cierra el flujo de escritura 
              Fescribe.close(); 
              return true;
}

Chuidiang

Pues lo dicho,

Fescribe.write(directory + "\r\n");

está llamando a directory.toString() para salvar la clase y toString(), por defecto, devuelve una especie de dirección de memoria ( tu DirectoryPackage.DirectoryPRAC5@76c511b )

Define en esa clase un método toString() sobreescribiendo el de Object y devuevle ahí el String que tú quieras meter en el fichero.

Se bueno.

betikano

Cita de: Chuidiang en 19 Mayo 2014, 22:27 PM
Pues lo dicho,

Fescribe.write(directory + "\r\n");

está llamando a directory.toString() para salvar la clase y toString(), por defecto, devuelve una especie de dirección de memoria ( tu DirectoryPackage.DirectoryPRAC5@76c511b )

Define en esa clase un método toString() sobreescribiendo el de Object y devuevle ahí el String que tú quieras meter en el fichero.

Se bueno.

en esta clase no me deja crear/sobreescribir nada, en principio debería escribirlo bien en el archivo tal y como me dan el toString()

ivancea96

Quizás lo que busques sea, en vez de hacer "Fescribe.write(directory + "\r\n");", ir metiendo cada elemento de el objeto, llamando a sus getters. No se cómo es el objeto, pero un ejemplo:

Código (java) [Seleccionar]
Fescribe.write(directory.getName() + "\r\n");