Foro de elhacker.net

Programación => Java => Mensaje iniciado por: betikano en 18 Mayo 2014, 19:20 pm



Título: guardar objecto en fichero
Publicado por: betikano en 18 Mayo 2014, 19:20 pm
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.


Título: Re: guardar objecto en fichero
Publicado por: 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 (http://www.chuidiang.com/java/ficheros/ObjetosFichero.php)


Título: Re: guardar objecto en fichero
Publicado por: betikano en 18 Mayo 2014, 23:27 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 (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


Título: Re: guardar objecto en fichero
Publicado por: 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.


Título: Re: guardar objecto en fichero
Publicado por: betikano en 19 Mayo 2014, 18:18 pm
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.

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 (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);
}
...


Título: Re: guardar objecto en fichero
Publicado por: 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.


Título: Re: guardar objecto en fichero
Publicado por: betikano en 19 Mayo 2014, 21:00 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;
}


Título: Re: guardar objecto en fichero
Publicado por: Chuidiang en 19 Mayo 2014, 22:27 pm
Pues lo dicho,

Código:
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.


Título: Re: guardar objecto en fichero
Publicado por: betikano en 19 Mayo 2014, 22:47 pm
Pues lo dicho,

Código:
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()


Título: Re: guardar objecto en fichero
Publicado por: ivancea96 en 19 Mayo 2014, 22:50 pm
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
  1. Fescribe.write(directory.getName() + "\r\n");


Título: Re: guardar objecto en fichero
Publicado por: betikano en 19 Mayo 2014, 23:04 pm
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
  1. Fescribe.write(directory.getName() + "\r\n");

así si:
            Fescribe.write(directory.space.toString() +"\r\n");

mil gracias crack!


Título: Re: guardar objecto en fichero
Publicado por: betikano en 24 Mayo 2014, 13:21 pm
Muy buenas de nuevo, tengo una duda, si yo se que en el archivo tengo que guardar varias lineas(tengo como una collection ) , como puedo hacer para que el varXX.write me pinte en el archivo todas las lineas y no sola una? (tengo una libreta de alumnos con varias notas, y al hacer el varXX.write solo me guarda 1 alumno y no todos los que tengo), gracias


Título: Re: guardar objecto en fichero
Publicado por: ivancea96 en 24 Mayo 2014, 14:58 pm
Un FOR recorriendo cada linea?


Título: Re: guardar objecto en fichero
Publicado por: betikano en 24 Mayo 2014, 18:48 pm
Un FOR recorriendo cada linea?

esa es mi duda, si se puede hacer un for con

   FileWriter    fw = new FileWriter(file, true);
   BufferedWriter  bw = new BufferedWriter(fw);
        bw.write(......);
   bw.newLine();   

            
   bw.close();   

de alguna manera que me vaya haciendo el bw.write cada vez en una linea distinta en el archivo.