ObjectInput/OutputStream Fragen zur Funktionsweise

TpointO

Neues Mitglied
Hallo zusammen,

für eine Übung soll ich ein Adressbuch schreiben. Dabei soll ich eine Klasse Adresse benutzen welches Serializable implementiert. Außerdem soll die Klasse die Methoden "public static void schreiben (Adresse [] adr)" und "public static void lesen (Adresse [] adr)" besitzen. Für diese Methoden benutze ich den ObjectInput - bzw. ObjectOutputStream.
Ich hab das jetzt so gehandhabt, dass in der Klasse Adressbuch die Adressen erzeugt werden und dann die Methode schreiben und danach lesen aufgerufen wird. Das Funktioniert soweit auch.
Das Problem ist aber, dass es für ein Adressbuch natürlich sinnvoll wäre wenn man Adressen hinzufügen könnte und das Funktioniert bei mir nicht.
Jedes mal wenn ich das Programm starte und über einen Scanner Adressen hinzufüge wird die "adressen.ser" Datei zwar länger und wenn man genau hinschaut sieht man auch die neuen Straßennamen, im Programm selber werden aber immer nur die Adressen angezeigt die man beim ersten Programmstart eingefügt hat (also beim allerersten Start, dann wenn die .ser Datei angelegt wird). Das ganze habe ich dann zusätzlich noch mit einer ArrayList probiert aber hier verhält sich das Programm gleich. Soweit zu meinem Problem.

Nun meine Frage:
Ich schätze ich habe ein Verständnisproblem wie genau ObjectInputStream und ObjectOutputStream funktionieren. Ich meine, dass der ObjectOutputStream das Object (also das AdressenArray) liest und in Bytes umwandelt. Diese Bytes schreibt er dann in die .ser Datei. Der ObjectInputStream liest dann diese .ser Datei und wandelt die Bytes wieder in ein Object um. Dieses Object kann dann wieder ganz normal behandelt werden. Meine Vermutung ist, dass mit jedem Programmstart ein neues Object in die .ser Datei geschrieben wird aber er immer nur ein Object liest und zwar das erste. Ist das soweit Richtig? Wenn ja, müsste ich dann die Objecte miteinander verknüpfen, sodass diese wieder nur ein einziges Object sind? Geht das? Und wenn ja wie? Wenn nein, wie sollte ich nun weiter vorgehen? Ist es möglich die Objecte nacheinander auszulesen?
Ich hab schon viel gegooglet aber bis jetzt noch keine Antwort auf meine Fragen gefunden. Wäre nett wenn mir jemand weiterhelfen könnte.

Ganz schön viel Text, tut mir Leid aber ich hoffe man versteht worin mein Problem liegt.
 
K

kneitzel

Gast
Du müsstest uns einmal genau den Code zeigen, den Du verwendest. Wie schreibst / liest du die Adressen genau?

Vermutlich hängst Du einfach die neue Adresse hinten an die Datei an, also du öffnest einen ObjectOutputStream auf einem FileOutputStream mit append=true?

Das Problem dabei wäre, dass die Erstellung des ObjectOutputStreams direkt einen Header schreibt:
https://docs.oracle.com/javase/7/do...html#ObjectOutputStream(java.io.OutputStream):
"This constructor writes the serialization stream header to the underlying stream;"

Was Du machen könntest:
a) Entweder immer das ganze Array schreiben, d.h. den Inhalt immer komplett überschreiben.

b) Deutlich komplexer: Du schreibst Deine eigene Serialisierung. Könnte auch auf ObjectStream basieren - brauchst dann "nur" eine Variante, die den Header beim Anhängen nicht schreibt.

Edit: BTW: Was mich irritiert ist, dass du keinen Fehler angibst. Evtl. hast Du try/catch Konstrukte mit leerem catch oder so? Wenn das beschriebene Szenario Dein Szenario ist, dann solltest Du eine StreamCorruptedException bekommen haben. Aber denkbar ist natürlich auch, dass Du das Array als Array geschrieben hast und du nur dieses liest, d.h. Du schreibst ein Array mit n Elementen, dann hängst du einzelne Elemente an ... beim Lesen wird aber nur das Array mit den n Elementen gelesen ....
 

TpointO

Neues Mitglied
Vermutlich hängst Du einfach die neue Adresse hinten an die Datei an, also du öffnest einen ObjectOutputStream auf einem FileOutputStream mit append=true?
Richtig.

Fehler werden mir keine Angezeigt.

Das Problem dabei wäre, dass die Erstellung des ObjectOutputStreams direkt einen Header schreibt:
https://docs.oracle.com/javase/7/do...html#ObjectOutputStream(java.io.OutputStream):
"This constructor writes the serialization stream header to the underlying stream;"
Danke, dann weiß ich schonmal wo ich suchen muss :D

Anbei mein Code

Code:
import java.io.FileOutputStream;
import java.io.ObjectOutputStream;
import java.util.Scanner;
import java.io.Serializable;
import java.io.FileInputStream;
import java.io.ObjectInputStream;


class Adresse implements Serializable
{
    int plz;  
    String str;
    int hausnmr;
   
   
    public Adresse (int plz, String str, int hausnmr)
    {
        this.plz = plz;
        this.str = str;
        this.hausnmr = hausnmr;
    }
    public void setPlz(int plz)
    {
        this.plz = plz;
    }
    public void setHausnmr(int hausnmr)
    {
        this.hausnmr = hausnmr;
    }
    public void setStr(String str)
    {
        this.str = str;
    }
    public String toString()
    {
        return plz +" "+ str + " " + hausnmr;
    }
    public static void schreiben (Adresse [] adr)
    {
        try
        {
            ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("adressen.ser", true));
            oos.writeObject(adr);
            oos.flush();
            oos.close();
        }
        catch(Exception e){System.out.println(e);}
    }
   
    public static void lesen (Adresse [] adr)
    {
        try
        {
            ObjectInputStream in = new ObjectInputStream(new FileInputStream("adressen.ser"));
            Adresse[] ad = (Adresse []) in.readObject();                                      
           
           
            for (int i = 0; i<ad.length; i++)
            {      
                if(ad[i] != null)
                System.out.println(ad[i]);
           
            }
           
        }

        catch(Exception e){System.out.println(e);}
    }
}

public class Adressbuch2
{
    public static void main (String [] args)
    {
        Scanner scanner = new Scanner(System.in);
       
        Adresse [] a = new Adresse [20];
       
        for (int i = 0; i<a.length; i++)
        {
            a [i] = new Adresse(0, null, 0);
            System.out.println("PLZ: ");
            int plz = Integer.parseInt(scanner.nextLine());
            a[i].plz = plz;
            System.out.println("Strasse: ");
            String str = scanner.nextLine();
            a[i].str = str;
            System.out.println("Hausnummer: ");
            int hausnmr = Integer.parseInt(scanner.nextLine());
            a[i].hausnmr = hausnmr;
            System.out.println("Weiter?: ");
            char yesNo = scanner.nextLine().charAt(0);
            if (yesNo == 'n')
                break;
        }
            a[0].schreiben(a);  
            a[0].lesen(a);  
                                           
    }
}

Edit: Was ich auch nicht verstehe ist, dass man keine for-Schleife benötigt zum einlesen. Ein "a[0].schreiben(a);" reicht aus. Dabei spielt es keine Rolle ob a[0] oder a[1] oder a[irgendwas]. Warum ist das so?
 
Zuletzt bearbeitet:
K

kneitzel

Gast
Die Methode schreiben ist eine statische Methode, d.h. sie existiert in der Klasse.
Daher solltest Du diese auch nicht auf einer Instanz sondern auf der Klasse selbst aufrufen. Statt also a[0].schreiben(a); solltest Du Adresse.schreiben(a) schreiben.

Und dann solltest Du bei ObjectOutputStream nicht anhängen sondern immer überschreiben (Auf Grund des headers, der geschrieben wird).

Und lesen sollte doch kein array übergeben bekommen sondern bestimmt ein array zurück geben, oder?
Also public static Adresse[] lesen ()

Die Adressen solltest Du immer in einer Collection speichern, die von der Größe her dynamisch ist. List würde ich da anbieten mit der konkreten Implementierung ArrayList.

Und du kannst dann z.B. schreiben:
Code:
List<Adresse> adressen = Arrays.toList(Adresse.lesen());
// adressen.add(new Adresse(.....));
Adresse.speichern(adressen.toArray(new Adresse[adressen.size()]);

Du liest also die Adressen mit Adresse.lesen() und mittels Array.toList wandelst Du es in eine List<Adresse> um.
Diese Liste kannst Du dann verändern.
Zum Speichern brauchst Du wieder ein Array. Dazu gibt es dann die Methode toArray. Da wir aber statt einem Array von Object ein Array von Adresse haben wollen, müssen wir die Version nehmen, die so ein Array übergeben bekommen will....

Der Code zeigt dann das hinzufügen einer Adresse. Du liest alle Adressen ein, fügst die neue adresse hinzu und speicherst dann alle Adressen ab.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
W Problem mit ObjectInput- und ObjectOutputStream Java Basics - Anfänger-Themen 14
K Warum wird hier nur etwas in eine txt Datei geschrieben und nicht in alle drei (InputStream/OutputStream/Reader/Writer) Java Basics - Anfänger-Themen 1
berserkerdq2 Wo ist der SInn, dass man den Stream, den ich zum Schreiben nutze, outputstream nenne? Java Basics - Anfänger-Themen 5
berserkerdq2 inputstream und bufferedwirter /outputstream und bufferedwriter Java Basics - Anfänger-Themen 9
J Nachricht an OutputStream Java Basics - Anfänger-Themen 2
I Probleme mit OutputStream - Datei lässt sich nicht öffnen Java Basics - Anfänger-Themen 4
B InputStream / OutputStream / PipedOutputStream und managedExecutorService Java Basics - Anfänger-Themen 3
B java.io.OutputStream zu java.io.InputStream konvertieren Java Basics - Anfänger-Themen 18
B Input/Output OutputStream im Paramaeter Java Basics - Anfänger-Themen 2
B OutputStream in FileInputStream? Java Basics - Anfänger-Themen 9
B Konvertieren: Outputstream zu Inputstream Java Basics - Anfänger-Themen 13
M ArrayList durch OutputStream in Datei Java Basics - Anfänger-Themen 9
S Objekte mit Outputstream in Safefile Java Basics - Anfänger-Themen 4
B Input/Output Socket I/O - outputStream.write(-1) Java Basics - Anfänger-Themen 2
B Socket OutputStream Java Basics - Anfänger-Themen 17
B Input/Output InputStream (JSch) in OutputStream (Blob) überführen Java Basics - Anfänger-Themen 8
B [Erledigt] Fehlverhalten mit File, FileInput/OutputStream und FileChannel Java Basics - Anfänger-Themen 4
Forlan OutputStream Initialisieren Java Basics - Anfänger-Themen 4
F DataIn/Outputstream Java Basics - Anfänger-Themen 4
lars-sh HttpURLConnection und OutputStream Java Basics - Anfänger-Themen 4
A String in OutputStream schreiben Java Basics - Anfänger-Themen 5
D An Datei "anhängen" mit OutputStream Java Basics - Anfänger-Themen 9
S Outputstream & String? Java Basics - Anfänger-Themen 4
reibi OutputStream nach ByteOutputStream konvertieren Java Basics - Anfänger-Themen 21
P OutputStream Java Basics - Anfänger-Themen 7
H OutputStream Java Basics - Anfänger-Themen 8
M ProcessBuilder und OutputStream Java Basics - Anfänger-Themen 2
M OutputStream funktioniert nur in Endlosschleife ? Java Basics - Anfänger-Themen 4
R OutputStream direkt in StringBuffer schreiben lassen Java Basics - Anfänger-Themen 2
G ClassLoader und OutPutStream Java Basics - Anfänger-Themen 3
G Standard OutputStream out wiederherstellen Java Basics - Anfänger-Themen 5
Zrebna Fragen zu einem Klassendiagramm Java Basics - Anfänger-Themen 8
H Fragen zu Wrapperklassen Java Basics - Anfänger-Themen 29
S Best Practice Fragen zu Projektstruktur einer Datenbank-Abfrage-App (MVC) Java Basics - Anfänger-Themen 13
A Bei VierGewinnt fragen ob man gegen CPU oder Menschen spielen will. Java Basics - Anfänger-Themen 7
A Bei VierGewinnt vorher fragen, ob man gegen den Computer spielen möchte oder gegeneinander. Java Basics - Anfänger-Themen 1
A Bei VierGewinnt fragen, ob man gegen den Computer spielen möchte oder gegeneinander Java Basics - Anfänger-Themen 1
sserio Wie kann man nach einer Klasse fragen? Java Basics - Anfänger-Themen 12
G Fragen zu Kompelierfehler in Aufgabe. Java Basics - Anfänger-Themen 25
E Bäume/ allgemeine Fragen Java Basics - Anfänger-Themen 21
O Falsche Antworten zu Fragen Java Basics - Anfänger-Themen 4
S Diverse Fragen vor Schulaufgabe ;) Java Basics - Anfänger-Themen 4
S Fragen zu Ausgabe double und float Java Basics - Anfänger-Themen 3
B fragen zu Aufbau eines UML-Klassendiagramm Java Basics - Anfänger-Themen 1
C 3 Fragen rund um Klassenattribute Java Basics - Anfänger-Themen 8
L Erste Schritte Log4J Fragen Java Basics - Anfänger-Themen 5
NeoLexx Fragen zu diversen Elementen der Javabibliothek Java Basics - Anfänger-Themen 5
D Budget Manager fragen zur Umsetzung Java Basics - Anfänger-Themen 9
N Fragen zur Datenspeicherung Java Basics - Anfänger-Themen 45
T Java Anfänger mit konkreten Fragen Java Basics - Anfänger-Themen 2
CT9288 Fragen zu Java Java Basics - Anfänger-Themen 16
W Fragen zu Generics Java Basics - Anfänger-Themen 14
J Fragen zu einer Methode Java Basics - Anfänger-Themen 3
J Fragen zum Code aus dem Buch "Schrödinger programmiert Java 2.te Ausgabe" Java Basics - Anfänger-Themen 6
Z Fragen zu Exception (Throws/throw) Java Basics - Anfänger-Themen 7
J Fragen zu Input/Output Java Basics - Anfänger-Themen 3
J Erste Schritte Oracle Tutorials zu Java 8 - Fragen dazu Java Basics - Anfänger-Themen 1
H Java Quereinsteiger Roadmap und Fragen Java Basics - Anfänger-Themen 29
H fragen Java Basics - Anfänger-Themen 15
M Samelsarium Grundlegender Fragen 2 Java Basics - Anfänger-Themen 9
M Sammelsarium an Grundlagen Grundlagen Fragen Java Basics - Anfänger-Themen 11
B Java ist / wird kostenpflichtig. Ein paar Fragen Java Basics - Anfänger-Themen 1
J Fragen zu synrchonized und kritischen Abschnitten Java Basics - Anfänger-Themen 5
S Fragen zu einem Rechentrainer Java Basics - Anfänger-Themen 2
B Java Vererbung Fragen (zu Code Beispiel) Java Basics - Anfänger-Themen 3
J Wo kann man Fragen zu ireport stellen. Java Basics - Anfänger-Themen 0
M Fragen zum Anlegen und Benutzen von Listen Java Basics - Anfänger-Themen 9
G Ein paar Anfänger Fragen zu StdDraw Java Basics - Anfänger-Themen 4
D Fragen zur Klassen Java Basics - Anfänger-Themen 4
Aprendiendo Zwei Fragen und ein geerbtes "protected"-Attribut Java Basics - Anfänger-Themen 2
J Interface Fragen bezüglich "Sauberkeit" von Code Java Basics - Anfänger-Themen 5
D Objekte-Fragen Java Basics - Anfänger-Themen 1
V Erste Schritte Habe Fragen zu der For und While Schleife als auch Inkrement und Dekrement Java Basics - Anfänger-Themen 4
D Anfänger-Fragen(Parameter einer Methode) Java Basics - Anfänger-Themen 7
K Zwei Fragen zu Graphics/Graphics2D Java Basics - Anfänger-Themen 5
R Fragen über den Konstruktor Java Basics - Anfänger-Themen 0
Azazel Ein paar Fragen zu Methodenaufrufen(java.awt) Java Basics - Anfänger-Themen 2
S Erste Schritte Fragen zur For-Schleife Java Basics - Anfänger-Themen 9
C Interface Fragen zum Interface Java Basics - Anfänger-Themen 7
GreenTeaYT Exception und zur OOP fragen? Java Basics - Anfänger-Themen 3
C Fragen zum Spigot Plugin (1.8) Java Basics - Anfänger-Themen 6
J Fragen zu Exceptions Java Basics - Anfänger-Themen 24
N Quiz- Fragen zufällig anzeigen lassen Java Basics - Anfänger-Themen 7
J Verschieden Fragen über Java Programmierung Java Basics - Anfänger-Themen 3
L Viele Fragen zu den Grundlagen Java Basics - Anfänger-Themen 5
B Fragen zu ZIP-File Java Basics - Anfänger-Themen 9
L fragen zu arrays Java Basics - Anfänger-Themen 8
L Fragen zu selbstgeschriebenem Programm Java Basics - Anfänger-Themen 5
M Fragen zum Auslesen von HTML Seiten Java Basics - Anfänger-Themen 5
J Threading-Aufgabe. Totale Noob Fragen, aber bitte trotzdem beantworten ;) Java Basics - Anfänger-Themen 7
S Java Fragen Konstruktor & Statische Methoden Java Basics - Anfänger-Themen 4
K Erste Schritte Frage Antwort Spiel - Fragen zur Planung Java Basics - Anfänger-Themen 2
C Java Applet Fragen: Serialisierung, Excel import Java Basics - Anfänger-Themen 2
Anfänger2011 2 kleine Fragen zu ArrayListen Java Basics - Anfänger-Themen 5
S Fragen zu Ausdrücken&Bedingungen Java Basics - Anfänger-Themen 5
A 2 kurze Anfänger fragen Java Basics - Anfänger-Themen 6
H grundlegende Fragen Java Basics - Anfänger-Themen 3
V Interface ich schäme mich das zu fragen, aber ich schaff nicht ein Text zu zentrieren :( [javaFX] Java Basics - Anfänger-Themen 6
N Programm: Fragen beantworten Java Basics - Anfänger-Themen 6
C Anfänger Anfänger Fragen Java Basics - Anfänger-Themen 8

Ähnliche Java Themen

Neue Themen


Oben