[JAVA] ObjectInputStream aus Datei laden

03/30/2014 22:19 Warnuk3r#1
Hallo. Ich habe eine Datei und durch ObjectInputStream speicher ich in die Datei und lade daraus dann was ich gespeichert habe.

PHP Code:
public static ArrayList<PersonpersonenListe = new ArrayList<Person>(); 
Speichern:

PHP Code:
    public static void personendaten_speichern(String pDateithrows IOException {
        
ObjectOutputStream outputStream null;
        
        try {
        
            
outputStream = new ObjectOutputStream(new FileOutputStream(pDatei));
            
            for (
int i 0personenListe.size(); i++) {
                
Person p1 personenListe.get(i);
                
outputStream.writeObject(p1);
            }
        } catch (
FileNotFoundException ex) {
            
ex.printStackTrace();
        } catch (
IOException ex) {
            
ex.printStackTrace();
        } 
finally {
            try {
                if (
outputStream != null) {
                    
outputStream.flush();
                    
outputStream.close();
                }
        } catch (
IOException e) {}
        }
    } 

Laden:

PHP Code:
    public static void personendaten_laden(String pDateithrows IOException {
        
ObjectInputStream inputStream null;
        
        try {
            
inputStream = new ObjectInputStream( new FileInputStream(pDatei));
            
            while(
inputStream.readObject() != null) { // Die Schleife
                
Person p1 = (PersoninputStream.readObject();
                
personenListe.add(p1);
            }
        } catch ( 
IOException e ) { System.err.println); }
        catch ( 
ClassNotFoundException e ) { System.err.println);
        } 
finally {
            try { 
inputStream.close();
            } catch ( 
Exception e ) { }
        }
        
    } 
Speichern geht, aber beim laden weiß ich nicht, wie ich eine Schleife machen soll. Hab gelesen, dass man eine unendliche Schleife machen kann mit != null wie oben gemacht und dann die EOFException abfangen soll um den Loop zu stoppen. Das geht bei mir aber nicht bzw. es wird halt nur ein Object geladen weil ich keinen Loop bekomme und wenn ich einen unendlichen mache dann stimmt auch iwas nicht ich glaube es wird dann auch nur eins geladen... in dem Beispiel hab ich das mal raus genommen weil ich grade mit den ganzen Exceptions nicht klar komme ._. ein Catch nach dem anderem...

Meine bitte ist also ob mir jemand sagen kann wie ich das so hin bekomme, dass ich auch aus der Datei laden kann.

PS: Werde morgen mal ausprobieren, danke Saedelaere!
03/30/2014 23:34 Saedelaere*#2
Ewig nichts mit Java gemacht, aber vielleicht so:
Code:
Person p1 = (Person) inputStream.readObject();
while(p1 != null) { 
  personenListe.add(p1);
  p1 = (Person) inputStream.readObject();
}
BTW: Ist die ArrayList nicht selbst auch ein Serializable? Wenn ja, sollte es funktionieren, dass du das komplette Listenobjekt mit einem einzigen writeObject()/readObject() Aufruf speicherst/ausliest.
03/31/2014 10:02 Warnuk3r#3
Vielen dank Saed, ist echt ein guter Ansatz p1 != null zu setzen, ich habs direkt mit objectRead versucht und das geht ja nicht.

Es funktioniert jetzt alles, aber wenn ich beim Menue den 4. Punkt auswähle (Daten laden dann sieht das folgendermaßen aus:

PHP Code:
Menuepunkt waehlen:
4
java
.io.EOFException

Daten wurden geladen

Das wird ausgegeben wegen:

PHP Code:
catch ( IOException e ) { System.err.println); } 
Wie sollte ich da jetzt verfahren? Soll ich versuchen die Meldung zu unterdrücken oder kann man am auslesen noch was verbessern, damit da nichts gelesen wird was auch nicht existiert? Das sagt ja die Exception... man liest nach dem Ende noch weiter..
03/31/2014 14:21 dowhile#4
[Only registered and activated users can see links. Click Here To Register...]
04/15/2014 00:56 Warnuk3r#5
Jetzt fürs Speichern:

Wenn ich ObjectOutputStream und writeObject benutze, speichert er mir immer die Objekte Person rein. Jedoch soll ich jetzt pro Zeile nur eine Person haben in der erstellen Datei.

Hab etwas rumprobiert, aber kriege es nicht hin.... wie kann ich mit ObjectOutputStream zeilenweise alle Personen abspeichern?

Laut Aufgabe soll es auch mit einem Semilikolon oder Komma getrennt sein, das geht doch niemals mit ObjectOutput? o.O
04/15/2014 06:13 dowhile#6
Du kannst das Objekt ja auch manuell speichern, also die Werte der Eigenschaften mit Komma getrennt in die Datei speichern. Beim Laden dann die Zeile lesen, am Komma trennen, Objekt erstellen und Werte setzen.
04/15/2014 21:22 Zunft#7
Benutze doch eine ForEach-Schleife und füge ein Kommata hinzu.