ObjectOutputStream Anzahl Objekte festhalten

ocsme

Top Contributor
Guten Tag,

Hier meine "Problem"!

Ich versuche Objekte auf die Platte zu schreiben. Natürlich verstehe ich das es so z. B. gemacht werden könnte :D
Java:
ObjectOutputStream oos = new ObjectOutputStream(
new FileOutputStream("rationals.ser"));
oos.writeObject(new Rational(2, 3));
oos.writeObject(new Rational(1, 4));
oos.writeObject(new Rational(7, 2));
oos.close();

Das ist nicht das Problem da hilft uns Java ja sehr viel weiter :)
Sondern ich würde gerne eine count Variable haben die mir vorher anzeigt viele Objekte in der Datei liegen. Denn das bräuchte ich ja als abbruchbedingung für die Schleife. z. B.

Muss ich dann 2 Schleifen machen um vorher fest zu halten wie groß der count ist? Diesen Count schreibe ich an den Anfang der Datei als Abbruchbedingung.
Oder was ich noch besser finden würde wäre so etwas in die Meta-Datei zu schreiben. Da ich das noch nie gemacht habe bräuchte ich hier bei echt Hilfe.

Ich hoffe man verstehe mein anliegen besser bekomme ich gerade nicht wirklich formuliert :(
Wenn nicht muss ich erst ein kleines Programm schreiben und ich zeige euch genau was ich meine :p

"Frohe Ostern noch!"

Liebe Grüße :)
 

Robat

Top Contributor
Warum packst du die Objekte nicht in eine Liste und serialisierst diese? Die Objekte werden im Programm doch sicherlich auch in einer Liste gehalten?
 

ocsme

Top Contributor
Hätte ich dann nicht das gleiche Problem und wüsste nicht wann das ende erreicht ist?
Nein derzeit habe ich nichts in einer Liste das sind auch nur so kleine Aufgaben z. B.: eine mini Matrix Programm schreiben:

Matrix(int n, int m): constructor that creates a matrix of size n x m, with all values initially set to 0;
void save(String filename): that saves the content of the matrix on the file specified by filename;
static Matrix read(String filename): that reads the data about a matrix from the file specified by filename, creates the matrix, and returns it;
Matrix sum(Matrix m): that returns the matrix that is the sum of the object and of m, if the two matrices have the same dimensions, and null otherwise;
Matrix product(Matrix m) : that returns the matrix that is the product of the object and of m, if the two matrices have compatible dimensions, and null otherwise

So gesehen kann man das ganze ja einfach Lösen mit:
Java:
    void save(String filename) throws  IOException{
        try {
            ObjectOutputStream oin = new ObjectOutputStream(new FileOutputStream(filename));
            oin.writeObject(this);
            oin.close();
            
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    
    
    static Matrix read(String filename) {
        try {
            ObjectInputStream oin = new ObjectInputStream(new FileInputStream(filename));
            Object c =(oin.readObject());
            if(c.getClass()==Matrix.class){
                oin.close();
                return((Matrix)c);
            }
            oin.close();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        return null;
    }

Ja das ganze ist nicht wirklich elegant und ohne try-with-resources Statement.
Ich würde aber gerne mehrere Objekte dieses Typs speichern und später wieder einlesen und dann sollen später auch gleich mehrere Objekte von einem anderen Typ gespeichert werden, doch das würde ja an der Anzahl der Objekte nichts ändern bis wohin man laufen müsste.

Wie du das genau mit der Liste meinst weiß ich nicht. Das Java-Framwork besprechen wir derzeit auch also die Array-List dürften wir nutzen aber wie soll man denn dann sowas machen? Das verstehe ich gerade nicht sry.

LG
 

ocsme

Top Contributor
Okay :)
erstmal Danke für die Antworten, ich versuch es mal so hin zu bekommen wie ich es mir vorstelle. Wenn es nicht Klappt Poste ich den code denke das bringt uns jetzt schneller weiter :)
LG
 

ocsme

Top Contributor
Also so wie ich das hier gemacht habe speichere ich 1 Objekt in 1 Datei:
Java:
void save(String filename) throws IOException {
         try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(filename))) {
             oos.writeObject(this);
         }
    }

    static Matrix read(String filename) throws IOException, ClassNotFoundException {
        try(ObjectInputStream ois = new ObjectInputStream(new FileInputStream(filename))){
            Object c =(ois.readObject());
            if(c.getClass()==Matrix.class)
                return((Matrix)c);
           
            return null;
        }
    }


Sobald ich mehrere Objekte Speichern will (auf Platte schreibe), benötige ich ja eine Liste von diesen Objekten und jetzt habe ich das verstanden was Ihr gemeint habt. Doch leider habe ich immer noch die Frage die im Code steht.
Java:
void save(Matrix[] matrix, String filename) throws IOException{
            try (ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(filename))) {
              for (Matrix i : matrix)
                out.writeObject(i);
            }
    }
   
    static Matrix[] read(String filename) throws IOException, ClassNotFoundException {
        /*
         * Bei der Referenzvariable tmp möchte ich nun die größe eintragen.
         * Diese größe ist die Länge des Arrays von save. Muss diese Länge nicht zuerst in
         * die Datei geschrieben werden? Dann liest man die ersten Bit aus der Datei heraus
         * und interpretiert dies als int wert. Da es ja vorher ein int wert war.
         */
        Matrix[] tmp = new Matrix[???];
         try (ObjectInputStream in = new ObjectInputStream(new FileInputStream(filename))) {
              for (int i = 0; i < tmp.length; i++)
                tmp[i] = (Matrix) in.readObject();
              return tmp;
         }
    }


Ich entschuldige mich auch wieder für die "doofe" Frage.

LG

und mal wieder noch eine "doofe" Frage zum Thema Exception. Müsste ich die Exception bei den Methoden catchen? NEIN oder? sollte ich an die nächst höher Instanz weiter geben und diese kümmert sich dann um die Fehlerbehandlung. Denn wenn ich es in der Methode catche läuft die Methode anschließend weiter und gibt z. B. noch etwas zurück oder sonst was :D
 
K

kneitzel

Gast
Du kannst ein Array auch direkt serialiiseren. Die Idee ist also, dass Du keine Schleife hast, in der Du jedes Element einzeln in die Datei schreibst sondern Du schreibst gleich das ganze Array.
Und genau so kannst Du es dann auch wieder einlesen. Du erzeugst also kein Array sondern bekommst dies vom ObjectInputStream zurück.
 

ocsme

Top Contributor
Könnte mir jemand Zeigen wie so etwas aussieht wenn man es als Array oder Liste Serialisiert?
Ich komme hier echt nicht mehr weiter :( denn nun bräuchte ich noch die ersten 8 Byte zu markieren das er dort nicht beginnt zu lesen. Denn ich erhalte folgenden Fehlercode:
Exception in thread "main" java.io.StreamCorruptedException: invalid stream header: 03000000
at java.io_ObjectInputStream.readStreamHeader(ObjectInputStream.java:866)
at java.io_ObjectInputStream.<init>(ObjectInputStream.java:358)
at Matrix.read(Matrix.java:32)
at Matrix.main(Matrix.java:145)

Derzeit habe ich es so gemacht:
Java:
public static void save(Matrix[] matrix, String filename) throws IOException{
            try (ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(filename));
                OutputStream os = new FileOutputStream(filename)) {
                int tmp = matrix.length;
                os.write(tmp);
               
              for (Matrix i : matrix)
                out.writeObject(i);
            }
    }
   
    static Matrix[] read(String filename) throws IOException, ClassNotFoundException {
         try (ObjectInputStream in = new ObjectInputStream(new FileInputStream(filename));
              InputStream is = new FileInputStream(filename)) {
             Matrix[] tmp = new Matrix[is.read()];
              for (int i = 0; i < tmp.length; i++)
                tmp[i] = (Matrix) in.readObject();
              return tmp;
         }
    }



LG
 
K

kneitzel

Gast
Nicht aufgeben! Du kannst doch erst einmal Deinen Code, den Du geschrieben hast, zum laufen bringen!

Du nutzt derzeit mehrere verschiedene Streams für eine Datei. Das ist etwas, das ich so nicht kenne bisher und wodrin ich auch keinen Sinn sehe.

Wieso schreibst Du deinen Integer nicht auch über den ObjectOutputStream? writeInt ist ja dazu da. Und dann beim lesen kommt ein readInt zum Einsatz.

Und schon läuft Dein Code ohne Probleme.
 

ocsme

Top Contributor
Ja sry!
Ich drück mich echt manchmal auch super doof hier aus!
Sollte das mal öfters wieder lesen was ich schreibe :D

Werde es später weiter versuchen bzw. evtl wird daraus erst morgen :( Viel zu viel derzeit um die Ohren denke das kann man sicher verstehen :)

Ich gelobe Besserung :)
 

ocsme

Top Contributor
Okay es klappt aber ich verstehe es nicht!
Bin ich etwas bei C Programmierung :D so hatte ich es heute Mittag auch schon und da kam auch schon diese StreamCorruptedError :(

Java:
    public static void save(Matrix[] matrix, String filename) throws IOException{
        try (ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(filename))) {
            out.writeInt(matrix.length);
              for (Matrix i : matrix)
                out.writeObject(i);
        }
    }

    static Matrix[] read(String filename) throws IOException, ClassNotFoundException {
        try (ObjectInputStream in = new ObjectInputStream(new FileInputStream(filename))) {
            Matrix[] tmp = new Matrix[in.readInt()];

            for (int i = 0; i < tmp.length; i++)
                tmp[i] = (Matrix) in.readObject();
            return tmp;
        }
    }


Eine Doofe Frage hätte ich aber noch. Oben hatte ich ja später 2 verschiedene Streams offen. Bekommt man es hin das wenn ich bei einem Stream anfange Bytes zu lesen das der andere Stream dann dort weiter macht wo der erste aufgehört hat?

Achso und was mir noch aufgefallen ist, wieso steht im HexEditor jetzt dort aber keine 3 drin wenn das Array die Länge drei hat? Sollten die ersten 4 Byte nicht mit 00 00 00 03 belegt sein? Die ersten 4 Byte sehen bei mir anders aus :(


LG
 

mihe7

Top Contributor
Bekommt man es hin das wenn ich bei einem Stream anfange Bytes zu lesen das der andere Stream dann dort weiter macht wo der erste aufgehört hat?
Im Allgemeinen nicht. Oder andersrum gesagt: das hängt von den Streams ab. Wenn Du beispielsweise einen BufferedInputStream nimmst, dann füllt dieser seinen Puffer mit den Daten aus dem darunterliegenden Stream. Folglich laufen die Streams nicht synchron.

Sollten die ersten 4 Byte nicht mit 00 00 00 03 belegt sein? Die ersten 4 Byte sehen bei mir anders aus :(
Die ersten vier Bytes sind der Stream Header, bestehend aus der Magic Number und der Versionsnummer (jeweils 2 Bytes). Primitive Datentypen werden als Blockdaten rausgeschrieben. Der Block hat ebenfalls einen Header, bestehend aus einem Block-Tag und der Länge. Ist die Länge kleiner als 256, besteht der Blockheader aus zwei Byte, ansonsten aus fünf. Erst dann folgen die Zahlen.

Code:
ac ed 00 05 77 08 7f ff  ff ff 00 00 00 01
<> <> <> <> <> <> <----------> <--------->
MM MM VV VV TT LL     Int1        Int2

M = Magic, V = Version, T = Tag, L = Length
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
J ObjectOutputStream writeChars, komische Zeichen nur in 1. Zeile Java Basics - Anfänger-Themen 2
S ObjectOutputStream kontinuierlich Java Basics - Anfänger-Themen 5
H ObjectOutputStream - mehr als nur ein Objekt ausgeben Java Basics - Anfänger-Themen 2
V ObjectOutputStream/ObjectInputStream eines Objectes fuer mehrere Threads Java Basics - Anfänger-Themen 6
G ObjectOutputStream Java Basics - Anfänger-Themen 3
H ObjectOutputStream Netzwerk writeObject Java Basics - Anfänger-Themen 6
R RandomAccessFile und ObjectoutputStream Java Basics - Anfänger-Themen 2
J ObjectOutputStream Java Basics - Anfänger-Themen 7
R ObjectOutputStream -> Daten an Datei anhängen Java Basics - Anfänger-Themen 3
W Problem mit ObjectInput- und ObjectOutputStream Java Basics - Anfänger-Themen 14
onlyxlia Anzahl Random Zahlen mit Scanner abfragen und in Array speichern Java Basics - Anfänger-Themen 10
T code so schreiben das er von sich selber anpasst (code soll die anzahl aller bustaben bestimmen) Java Basics - Anfänger-Themen 16
C Parameter in verschiedenen Anzahl und Typen Java Basics - Anfänger-Themen 6
Ibrahim Anzahl möglicher Reiserouten zurückgeben Java Basics - Anfänger-Themen 5
K loop pausieren für eine bestimmte Anzahl? Java Basics - Anfänger-Themen 1
B bei 2 Arrays Anzahl gleicher Elemente vergleichen? Java Basics - Anfänger-Themen 49
M Anzahl Kommandozeilenparamter mittels Methode Java Basics - Anfänger-Themen 11
I Eindeutiger String mit maximaler Anzahl an Zeichen Java Basics - Anfänger-Themen 11
nils812 Black Jack Karten Anzahl begrenzen Java Basics - Anfänger-Themen 5
berserkerdq2 sqllite in Java, wenn ich mache select count(*) ..., erhalte ich dann nur die gezählte Anzahl oder werden auch die Tabellen ausgegeben? Java Basics - Anfänger-Themen 2
I Prüfen, ob Anzahl an Monate ein Jahr ergeben Java Basics - Anfänger-Themen 4
B Anzahl Nullen uns Einsen in String ermitteln Java Basics - Anfänger-Themen 3
O Ich habe einen String und soll mit matches schauen, ob ein Buchstabe zu einer geraden ANzahl im String vorkommt, wie soll das gehen? Java Basics - Anfänger-Themen 7
C Anzahl ArrayLists unbekannt Java Basics - Anfänger-Themen 4
O Anzahl Datensätze ausgeben Java Basics - Anfänger-Themen 5
T Maximale Anzahl von Konsonanten im String Java Basics - Anfänger-Themen 6
N Aus einem String die Anzahl der Vokale auslesen Java Basics - Anfänger-Themen 40
W Dez-->Binär mit eigener bit Anzahl Erkennung. Java Basics - Anfänger-Themen 3
RudiRüssel maximale Anzahl von Schlüsseln in einer Hash Tabelle Java Basics - Anfänger-Themen 2
W Anzahl der Zeilen ausgeben lassen Java Basics - Anfänger-Themen 20
J Verschieben von Buchstaben in einem String um vorgegebene Anzahl von Zeichen innerhalb eines weiteren String Java Basics - Anfänger-Themen 12
Kingamadeus2000 Anzahl der Ziffern der kürzesten Zahl aus einem zurückliefern Java Basics - Anfänger-Themen 1
Tino1993 for-Schleife, die eine vorgegebene Anzahl von Zeichen ausgibt Java Basics - Anfänger-Themen 3
M Anzahl Schleifendurchgänge nach x Sekunden anzeigen Java Basics - Anfänger-Themen 2
P Primzahl mit Angabe der höchsten Primzahl und Angabe der Anzahl von Primzahlen bis 100 Java Basics - Anfänger-Themen 8
L Anzahl der benachbarten Minen berechnen und setzen Java Basics - Anfänger-Themen 15
Kirby.exe Anzahl vorkommender Elemente im Array zählen Java Basics - Anfänger-Themen 9
B Nur eine bestimmte Anzahl an Arrays ausgeben Java Basics - Anfänger-Themen 9
hello_autumn Klassen Anzahl sowie die Anzahl der Junit Tests ermitteln? Java Basics - Anfänger-Themen 8
B Von Array nur eine bestimmte Anzahl bekommen Java Basics - Anfänger-Themen 3
L Anzahl der Paare deren Summe = 0 ergibt berechnen Java Basics - Anfänger-Themen 0
L Anzahl der Elemente key in einem Array mit log(N) Laufzeit Java Basics - Anfänger-Themen 4
L Anzahl der Aufrufe von Schleifen bestimmen Java Basics - Anfänger-Themen 1
D Alle Möglichkeiten, n-Anzahl aus Elementen aus einem Array zu wählen, ausgeben? Java Basics - Anfänger-Themen 23
B Frage zu: String... strings -> Ungleiche Anzahl an Parameter? Java Basics - Anfänger-Themen 4
B Anzahl von Stunden / Tage von zwei Datumswerten ermitteln Java Basics - Anfänger-Themen 1
L Dynamische Anzahl an Arrays mit verschiedenen Namen erzeugen Java Basics - Anfänger-Themen 6
H Anzahl verschiedener Buchstaben im String Java Basics - Anfänger-Themen 41
sondr Anzahl der gleichen Positionen im Array Java Basics - Anfänger-Themen 3
Y Konkrete Hilfe gesucht - Anzahl der Stellen einer eingegebenen Zahl überprüfen Java Basics - Anfänger-Themen 5
Y Begrenzte Anzahl an Objekten? Java Basics - Anfänger-Themen 12
P Input/Output Bestimmte Anzahl von Werten in einem Array an Methode übergeben Java Basics - Anfänger-Themen 2
L Graphen: Anzahl Knoten // Knoten in Array speichern Java Basics - Anfänger-Themen 4
E Anzahl Datensätze in Textfeld Java Basics - Anfänger-Themen 5
K Anzahl gleicher Elemente in Array Java Basics - Anfänger-Themen 32
T befehle unterschiedlicher anzahl an strings wiedergeben Java Basics - Anfänger-Themen 2
L Feld mit beliebiger Anzahl von Buchstaben füllen... Java Basics - Anfänger-Themen 5
LikeManuel Anzahl der Teiler Java Basics - Anfänger-Themen 6
D Anzahl von Zahlen bei eingabe begrenzen Java Basics - Anfänger-Themen 37
T Erste Schritte Schreiben Sie eine Klasse Zeit, die eine Zeitdauer in Minuten beschreibt. Die Anzahl Minuten verwalt Java Basics - Anfänger-Themen 3
J Max. Anzahl von Knoten im Binärbaum Java Basics - Anfänger-Themen 3
ralli85 Programm nach einer gewissen Anzahl von Eingaben beenden Java Basics - Anfänger-Themen 15
Z Ausgabe: Anzahl Sterne, danach verringern Java Basics - Anfänger-Themen 7
R Anzahl von Zeichen in einem Char Array Java Basics - Anfänger-Themen 4
A Anzahl der Elemente in einem Stack wiedergeben Java Basics - Anfänger-Themen 3
V Anzahl der Möglichkeiten 20 € zu bezahlen Java Basics - Anfänger-Themen 2
A variable Anzahl an Nutzereinagben Java Basics - Anfänger-Themen 4
stylegangsta Anzahl der gefunden array Werte ausgeben Java Basics - Anfänger-Themen 6
D Variable Anzahl an Buttons per Schleife Java Basics - Anfänger-Themen 7
H Liste ausgeben (Spiel Hey Fisch (software-challenge) ändern Anzahl Fische) Java Basics - Anfänger-Themen 1
M Überschneidende Anzahl von Tagen Java Basics - Anfänger-Themen 4
D Suche nach der Anzahl von Zonen zwischen zwei Punkten Java Basics - Anfänger-Themen 2
S Input/Output Alphabet in eine Datei schreiben und Anzahl von Zeichen ausgeben. Java Basics - Anfänger-Themen 4
I Anzahl der Rechenschritte darstellen lassen Java Basics - Anfänger-Themen 11
C Anzahl bestimmter Zeichen in einem String ausgeben Java Basics - Anfänger-Themen 7
T Anzahl bestimmter Werte eines arrays bestimmen Java Basics - Anfänger-Themen 4
A Rekursion, Anzahl von Stellen ausgeben Java Basics - Anfänger-Themen 7
S Anzahl Quersummen bis zur Einstelligkeit Java Basics - Anfänger-Themen 12
S Anzahl unterschiedlicher Elemente zählen Java Basics - Anfänger-Themen 4
G Performance - höhere Anzahl Swing Elemente Java Basics - Anfänger-Themen 5
R Begrenzer Anzahl von paint() ? Java Basics - Anfänger-Themen 3
J Anzahl von for-Schleifen in Abhängigkeit von Zahleneingabe erzeugen Java Basics - Anfänger-Themen 1
C Beliebige Anzahl Arrays zusammenfügen Java Basics - Anfänger-Themen 5
L Best Practice Alle Kombinationen aus Listenelementen, Anzahl Listen unterschiedlich Java Basics - Anfänger-Themen 6
I Methoden ByteBuffer - Anzahl führender Nullen Java Basics - Anfänger-Themen 3
E Array Anzahl verschiedener Werte ausgeben Java Basics - Anfänger-Themen 3
V Anzahl von gleichen Werten in einem Int-Array ermitteln Java Basics - Anfänger-Themen 4
B Anzahl if anweisungen nicht bekannt Java Basics - Anfänger-Themen 3
T Anzahl der Schritte berechnen Java Basics - Anfänger-Themen 6
R Anzahl der ineinander verschachtelten for-Schleifen von Variable abhängig machen Java Basics - Anfänger-Themen 5
P BitSet- Objekt- Anzahl der Elemente bestimmen Java Basics - Anfänger-Themen 2
B Variablen Unbekante anzahl an Strings splitten und vergleichen Java Basics - Anfänger-Themen 31
M Anzahl Zahlen in String Java Basics - Anfänger-Themen 21
A Threads Minimale und maximale Anzahl. Java Basics - Anfänger-Themen 28
J Bestimmte Anzahl Zeichen aneinander fügen Java Basics - Anfänger-Themen 9
H Anzahl Ziffer in Zahl bestimmen Java Basics - Anfänger-Themen 3
A Anzahl nodes in einem Tree Java Basics - Anfänger-Themen 2
G maximale Anzahl der Tage im Monat Java Basics - Anfänger-Themen 18
G Datentypen Double ausgeben mit minimaler Anzahl Nachkommastellen Java Basics - Anfänger-Themen 3
P Anzahl der else if Operatoren begrenzt?? Java Basics - Anfänger-Themen 7

Ähnliche Java Themen

Neue Themen


Oben