[Java] Eigene Klasse in File speichern und lesen

Dieses Thema im Forum "Programmierung & Entwicklung" wurde erstellt von Prrovoss, 15. Juli 2013 .

  1. 15. Juli 2013
    Zuletzt bearbeitet: 15. Juli 2013
    Eigene Klasse in File speichern und lesen

    hi,
    ich hab mir ne eigene Klasse geschrieben, die einige booleans und Strings speichert.
    diese werden zur laufzeit gesetzt und sollen dann in eine datei gespeichert werden.

    beim nächsten start soll die gespeicherte datei wieder eingelesen werden und die darin enthaltenen daten sollen wieder in meine klasse geschrieben werden.

    die Klasse in der die daten gespeichert werden:
    PHP:
    import java . io . Serializable ;


    public class 
    Settings  implements  Serializable {
    booleans strings etc .....
    }

    die methode zum speichern der klasse sieht so aus:
    PHP:
         private static  void saveSettings ()  throws IOException  {
            try{
                
    //use buffering
                
    OutputStream file  = new  FileOutputStream "settings.ser"  );
                
    OutputStream buffer  = new  BufferedOutputStream file  );
                
    ObjectOutput output  = new  ObjectOutputStream buffer  );
                try{
                  
    output . writeObject ( settings );
                }
                finally{
                  
    output . close ();
                }
              }  
              catch(
    IOException ex ){
                
    System . out . println ( "fehler" );
              }
        }
    settings is dabei eine instanz der Settings Klasse. ich lasse sie mir nach dem speichern in die konsole ausgeben, die daten stehen auf jeden fall da drin.



    hier die methode zum laden der settings:
    PHP:
         private static  void loadSettings ()  throws IOException ClassNotFoundException  {
             try{
                  
    //use buffering
                  
    InputStream file  = new  FileInputStream "settings.ser"  );
                  
    InputStream buffer  = new  BufferedInputStream file  );
                  
    ObjectInput input  = new  ObjectInputStream  buffer  );
                  try{
                    
    //deserialize the List
                    
    settings  = ( Settings ) input . readObject ();
                    
    System . out . println ( settings );
                  }
                  finally{
                    
    input . close ();
                  }
                }
                catch(
    ClassNotFoundException ex ){
                  
    System . out . println ( "Cannot perform input. Class not found." );
                }
                catch(
    IOException ex ){
                  
    System . out . println ( "Cannot perform input." );
                }
              }
    wenn ich mir danach die klasse ausgeben lasse, sind alle werte null bzw false.
    wenn vorher schon werte in der klasse vorhanden waren, werden diese nicht verändert.
    das einlesen der datei ändert also rein garnichts an meiner klasse^^

    wo genau liegt der fehler?
    muss ich in der settings klasse noch irgendwas implementieren, damit die werte korrekt in die datei geschrieben werden?
     
  2. 15. Juli 2013
    AW: Eigene Klasse in File speichern und lesen

    also ich würde das schreiben so machen:

    PHP:

     
    private static  void saveSettings ()  throws IOException  {
            try{
                
    OutputStream file  = new  FileOutputStream "settings.ser"  );
                
    ObjectOutput output  = new  ObjectOutputStream file  );
                try{
                  
    output . writeObject ( settings );

                }
                finally{
                  
    output . flush ();
                  
    output . close ();
                }
              }  
              catch(
    IOException ex ){
                
    System . out . println ( "fehler" );
              }
        }  

    Den Inputstream würde ich analog dazu erstellen:

    PHP:
    InputStream file  = new  FileInputStream "settings.ser"  );
    ObjectInput input  = new  ObjectInputStream  file );

    ....
    settings  = ( Settings ) input . readObject ();

    das wirklich entscheidende ist wahrscheinlich der Aufruf von flush()
     
  3. 15. Juli 2013
    AW: Eigene Klasse in File speichern und lesen

    nope, hat sich leider nichts geändert.
    der inhalt der settings.ser ist auch nur ein einzeiler, mit 29 zeichen. kommt mir ein bisschen kurz vor.
    es stehen aber auch einige steuerzeichen o.ä. drin, gibts im notepadd++ ne möglichkeit sich das anders anzeigen zu lassen?
     
  4. 15. Juli 2013
    Zuletzt von einem Moderator bearbeitet: 14. April 2017
    AW: Eigene Klasse in File speichern und lesen

    Dann liegt es nicht am schreiben / lesen an sich sondern an anderen sachen.
    Hier mal ein Test, den ich auf die schnelle zusammengetippt habe:
    Download: Test.rar | www.xup.in

    Bitte nicht auf den Programmierstil achten
     
  5. 15. Juli 2013
    Zuletzt von einem Moderator bearbeitet: 14. April 2017
    AW: Eigene Klasse in File speichern und lesen


    braucht man die getter/setter methoden in der settings klasse, damit die settings.ser vernünftig geschrieben wird??
    deine settings.ser sieht nämlich ganz anders und viel länger aus als meine^^
    in deiner sind ja die einzelnen wertenamen noch rauszulesen, in meiner steht ganichts...

    oder dürfen die variablen in der settings klasse bestimmte modifikatoren nicht haben?
    meine sind public static, deine private

    edit
    an dem static wirds wohl iegen...
     
  6. 15. Juli 2013
    Zuletzt von einem Moderator bearbeitet: 14. April 2017
    AW: Eigene Klasse in File speichern und lesen

    Nein brauchst du nicht.
    Hier das gleiche ohne getter/setter

    Download: Test.rar | www.xup.in

    Ansonsten kannst du mir deinen quellcode mal geben, dann kann ich dir vielleicht schneller helfen. (von mir aus auch per pm)

    richtig, static dürfen die nicht sein.

    Ich würde dann aus der Klasse ggf. ein Singleton machen und die Attribute dann auf private setzen.
     
    1 Person gefällt das.
  7. 15. Juli 2013
    AW: Eigene Klasse in File speichern und lesen

    ja, ich habs jetz erstma so gelassen und nur das static rausgenommen. scheint zu laufen^^
     
  8. 15. Juli 2013
    AW: Eigene Klasse in File speichern und lesen

    ja, ist aber echt kein guter stil
     
  9. 15. Juli 2013
    AW: Eigene Klasse in File speichern und lesen

    das stimmt allerdings, für private tools benutze ich aber keine design patterns o.ä.
     
  10. 15. Juli 2013
    AW: Eigene Klasse in File speichern und lesen

    Es ist doch logisch, dass die Dinger nicht statisch sein dürfen, wenn du eine >Instanz< einer Klasse aka Objekt serialisieren willst

    Elemente die als "private" deklariert sind werden in der Regel auch nicht serialisiert.

    Außerdem muss die entsprechende Klasse einen Standardkonstruktor (ohne Parameter) oder gar keinen haben, sonst gibt es Probleme mit der Reflection, wenn versucht wird das Ding zu serialisieren.

    Das hier könnte auch noch interessant sein:

    The Java serialization algorithm revealed | JavaWorld
     
  11. 15. Juli 2013
    AW: Eigene Klasse in File speichern und lesen

    Waren bei mir alle
    Hatte keinen Standardkonstruktor und einen eigenen.

    Und dennoch ging es ?(
     
  12. 15. Juli 2013
    Zuletzt bearbeitet: 15. Juli 2013
    AW: Eigene Klasse in File speichern und lesen

    Java Serialization and need for a no-arg constructor

    Auch das De-serialisieren (Datei -> Objekt)? Darum geht es dabei ja. Der leere Konstruktor wird benötigt um eine leere Instanz zu erstellen die dann mit Leben gefüllt werden kann. Und private Felder sollten dann auch nicht mehr gefüllt werden werden können.

    Kann mir schwer vorstellen, dass sich da etwas geändert hat. Und falls doch würde mich brennend interessieren was die da machen
     
  13. 15. Juli 2013
    Zuletzt bearbeitet: 15. Juli 2013
    AW: Eigene Klasse in File speichern und lesen

    Klaro ging das Also kannst dir ja gerne das Projekt laden, ich konnte mit dem geladenen objekt "arbeiten". hab zwar nur die daten ausgegeben, aber ich denke alles andere sollte auch funktionieren.

    Habe das (wenn ich mich richtig erinner) auch immer in der Form gemacht. Also inkl. private Attributen und ohne Standardkonstruktor (wobei ich mir dabei nicht ganz sicher bin)
     
  14. 16. Juli 2013
    Zuletzt bearbeitet: 16. Juli 2013
    AW: Eigene Klasse in File speichern und lesen

    Alles was ich gesagt habe trifft zu. Allerdings nur dann, wenn man Objekte als XML (de)serialisieren will

    Code:
    import java.beans.XMLEncoder;
    
    [...]
    
    XMLEncoder xmlEncoder = new XMLEncoder(new FileOutputStream("TestEntity.xml"));
    xmlEncoder.writeObject(testEntity);
    
    Das würde mit deiner Datenstruktur nicht funktionieren.
     
    1 Person gefällt das.
  15. 16. Juli 2013
    AW: Eigene Klasse in File speichern und lesen

    hm als xml is natürlich noch cooler als mit der .ser datei^^ garnich dran gedacht
     
  16. 19. Juli 2013
    AW: Eigene Klasse in File speichern und lesen

    Wenn du nur Key-Value-Pairs speichern willst würde sich auch einfach eine Property-Datei anbieten, ist super einfach und schnell gemacht:

    klick

    Da fällt das Serialisieren komplett weg, weil alles als String betrachtet wird. Musst halt nur beim Auslesen dann wieder alles casten.
     
    1 Person gefällt das.
  17. 20. Juli 2013
    AW: Eigene Klasse in File speichern und lesen

    Ah, sehr praktisch! Wieder was gelernt
     
    1 Person gefällt das.
  18. Video Script

    Videos zum Themenbereich

    * gefundene Videos auf YouTube, anhand der Überschrift.