ObjectInputStream kann nicht vernünftig lesen...

Ph3n1x

Mitglied
Hallo Leute,

ich programmiere gerade schön vor mich her und stelle jetzt folgendes fest:

Ich habe folgenden Code:
Java:
// icon ist vom Typ BufferedImage
public void writeInOOS(ObjectOutputStream oos) throws IOException {
        oos.writeUTF(comment);
        oos.writeUTF(tag);
        oos.writeBoolean(icon != null);
        if (icon != null) {
            oos.writeInt(icon.getWidth());
            oos.writeInt(icon.getHeight());
            oos.writeInt(icon.getType());
            for (int x = 0; x < icon.getWidth(); x++) {
                for (int y = 0; y < icon.getHeight(); y++) {
                    oos.writeInt(icon.getRGB(x, y));
                }
            }
        }
}
public void readFromOIS(ObjectInputStream ois) throws Exception {
        comment = ois.readUTF();
        tag = ois.readUTF();
        if (ois.readBoolean()) {
            int width = ois.readInt();
            int height = ois.readInt();
            int imageType = ois.readInt();
            icon = new BufferedImage(width, height, imageType);
            for (int x = 0; x < width; x++) {
                for (int y = 0; y < height; y++) {
                    icon.setRGB(x, y, ois.readInt());
                }
            }
        }
}

Soo, wenn ich jetzt die Daten in meinen Outputstream speichere (inkl. einem 16*16 Bild) funktioniert das Speichern ohne Probleme. Beim Laden jedoch kommt an der Stelle
Java:
                    icon.setRGB(x, y, ois.readInt());
direkt bei x=0 und y=0 eine Exception:
Java:
java.io.StreamCorruptedException: unexpected EOF in middle of data block
	at java.io.ObjectInputStream$BlockDataInputStream.refill(ObjectInputStream.java:2494)
	at java.io.ObjectInputStream$BlockDataInputStream.read(ObjectInputStream.java:2570)
	at java.io.DataInputStream.readInt(DataInputStream.java:370)
	at java.io.ObjectInputStream$BlockDataInputStream.readInt(ObjectInputStream.java:2775)
	at java.io.ObjectInputStream.readInt(ObjectInputStream.java:949)

Alle anderen Daten ließt er ohne Probleme aus, aber am Bild hängt er sich auf, obwohl es nur Integer Werte sind die gespeichert und wieder gelesen werden sollen.

Wenn ich den Teil mit dem Bild speichern weglasse funktioniert alles wunderbar, aber ich verstehe nicht, wieso? Was hab ich falsch gemacht?

Hat jemand eine Idee?

Gruß

Ph3n1x
 
S

Spacerat

Gast
Ein ähnliches Problem hatte ich mal, als ich vergas, den Stream vor Programmende zu schliessen. So wurde dann eine Datei z.B. nicht vollständig geschrieben.
 
S

SlaterB

Gast
schon merkwürdig, werde ich vielleicht morgen mit eigenen Icon testen,

eine kleine mögliche Hilfe:
verwende beim Schreiben nicht icon.getWidth() usw. mehrfach, sondern lege das in einer Variablen ab,
schwankt vielleicht wenn noch nicht vollständig geladen, aber sollte ja eher nur größer werden..,
logge auch wieviel geschrieben wird, prüfe die Größe der erzeugten Datei mit verschieden großen Icons,

dass das close() usw. hier fehlt ist sehr verdächtig


---

falls nicht bekannt dann alternatives Vorgehen erwähnenswert:
speichere nicht soviel komisches einzeln, sondern speichere exakt ein Object,
writeObject(), readObject(), fertig, mehr brauch dich der Stream gar nicht interessieren

in dem einen Objekt musst du nun alle Informationen ablegen, dahin verlagert sich das Problem,
z.B. ein langes byte[], eine Liste, eine Map mit Einträgen wie "width", "isNull" usw., je nach Möglichkeit das Icon an sich,
oder naheliegend eine neue eigene Klasse, darin etwas von den vorher genannten, oder auch einfache int-Variablen, int[][] für das Raster usw.
 
Zuletzt bearbeitet von einem Moderator:
S

Spacerat

Gast
Also beim ObjectOutputStream kannst dir das explitite "flush()" auch sparen, denn es wird bei "close()" automatisch ausgeführt. Möglicherweise muss das ja nur weglassen werden, ein "flush()" an falscher Stelle kann verheerend sein, dann schon lieber "drain()".
 

bERt0r

Top Contributor
Du könntest auch versuchen dein Image mit ImageIO zu schreiben:
static boolean write(RenderedImage im, String formatName, OutputStream output)
Writes an image using an arbitrary ImageWriter that supports the given format to an OutputStream.
 

Ph3n1x

Mitglied
Du könntest auch versuchen dein Image mit ImageIO zu schreiben:

Das weiß ich, aber ich möchte später auf einem Android Gerät das Bild auch wieder laden können, daher speichere ich so die Daten in den Stream und hoffe dass ich das unter Android dann wieder auslesen kann...
Aber erstmal muss es generell funktionieren...

@Spacerat
flush mache ich, wie ich gerade festgestellt habe, unmittelbar vor dem close(), also nichts schlimmes...

@SlaterB
Das mit dem writeObject() hatte ich anfangs, hat genauso wenig funktioniert...
 
S

SlaterB

Gast
> hat genauso wenig funktioniert...
ohne Erklärungen auch nicht zu klären

möglich dass dein Fehler unerklärbar bleibt, ich tippe aber auf irgendwas schlechtes im Restcode wie das schon genannte falsche close() usw.
hier ein vollständiges Programm:
Java:
public class Test
{
    static BufferedImage icon;

    public static void main(String... args)
        throws Exception
    {
        icon = ImageIO.read(new File("test.png"));
        File f = new File("test.ser");
        ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(f));
        writeInOOS(out);
        out.close();
        System.out.println("length: "+f.length());
        ObjectInputStream in = new ObjectInputStream(new FileInputStream(f));
        readFromOIS(in);
    }

    public static void writeInOOS(ObjectOutputStream oos)
        throws IOException
    {
        oos.writeUTF("test");
        oos.writeUTF("Dienstag");
        oos.writeBoolean(icon != null);
        if (icon != null)
        {
            oos.writeInt(icon.getWidth());
            oos.writeInt(icon.getHeight());
            oos.writeInt(icon.getType());
            System.out.println("icon: "+icon.getType()+", "+icon.getWidth()+", "+icon.getHeight());
            for (int x = 0; x < icon.getWidth(); x++)
            {
                for (int y = 0; y < icon.getHeight(); y++)
                {
                    oos.writeInt(icon.getRGB(x, y));
                }
            }
        }
    }

    public static void readFromOIS(ObjectInputStream ois)
        throws Exception
    {
        System.out.println(ois.readUTF());
        System.out.println(ois.readUTF());
        if (ois.readBoolean())
        {
            int width = ois.readInt();
            int height = ois.readInt();
            int imageType = ois.readInt();
            System.out.println("imageType: "+imageType);
            icon = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
            for (int x = 0; x < width; x++)
            {
                for (int y = 0; y < height; y++)
                {
                    icon.setRGB(x, y, ois.readInt());
                }
            }
        }
        System.out.println("fertig: "+ois.available());
    }
}
welches mit dem Bild im Anhang folgenden Output liefert:
Code:
icon: 0, 20, 20
length: 1643
test
Dienstag
imageType: 0
fertig: 0
den ImageType 0 mochte der BufferedImage-Konstruktor bei mir nicht so sehr, aber das ist ja ein anderes Problem,
'fertig 0' am Ende bedeutet dass exakt alles gelesen wurde

kannst ja mein Programm bei dir ausprobieren, oder ein eigenes Icon posten,
oder mehr von deinem Code
oder auf eine sonstige nachvollziehbare Weise ein Problem, ich sehe im Moment keines ;)


edit:
> und hoffe dass ich das unter Android dann wieder auslesen kann...

verschiedene Betriebssysteme/ Computer mit eigenen Interpretationen könnten natürlich immer irgendwie Probleme machen.., obwohl vielleicht gerade die Serialisierung dagegen gefeilt sein sollte,
schon auf nur einem PC getestet wie mit meinem Programm?
 

Anhänge

  • test.png
    test.png
    407 Bytes · Aufrufe: 40
Zuletzt bearbeitet von einem Moderator:

Ph3n1x

Mitglied
Das ist echt komisch...
Habs ausprobiert, dein Code funktioniert soweit... Bei mir im Code nochmal geguckt etc. aber ist im Grunde nicht anders...

Mal Grob skizziert:
Java:
public class C {

     List<A> listOfA = new ArrayList<A>();

     public static void main(String[] args) {
          // SAVE
          A a = new A(); // evtl auch mehrere
          B b = new B(); 

          // ....
          // Befüllen mit ein paar Daten und "b" zu irgend einem "a" in die Liste einfügen 
          // und die erstellten "a"s in die listOfA einfügen
          // ....

          ObjectOutputStream oos = new ObjectOutputStream(fos); // FileOutputStream

          oos.writeInt(listOfA.size());
          for (A a : listOfA) {
              a.writeInOOS(oos);
          }

          oos.flush();
          oos.close();  

          // LOAD 
          // alles leeren etc.
          ObjectInputStream ois = new ObjectInputStream(fis); // FileInputStream

          int size = ois.readInt();
          for (int i= 0; i< size; i++) {
                A a = new A();
                a.readFromOIS(ois);
                listOfA.add(a);
          }
          ois.close();           
     }
}

public class A {

     List<B> listOfB = new ArrayList<B>();
     String bla = "BLA";

     // ... Liste Befüllen ...

     public void writeToOOS(ObjectOutputStream oos) {
           oos.writeUTF(bla);
           oos.writeInt(listOfB.size());
           for (B b : listOfB) {
                 b.writeToOOS(oos);
           }
     }

     public void readFromOIS(ObjectInputStream ois) {
           bla = ois.readUTF();
           int size = ois.readInt();
           for (int i= 0; i<size; i++) {
                 B b = new B();
                 b.readFromOIS(ois);
                 listOfB.add(b);
           }
     }
}

public class B {

     String bla = "BLA";
     String blub = "BLUB";
     BufferedImage icon;

     // ... Image Befüllen ...

     public void writeToOOS(ObjectOutputStream oos) {
           oos.writeUTF(bla);
           oos.writeUTF(blub);
           oos.writeBoolean(icon != null);
           if (icon != null) {
              oos.writeInt(icon.getWidth());
              oos.writeInt(icon.getHeight());
              oos.writeInt(icon.getType());
              for (int x = 0; x < icon.getWidth(); x++) {
                  for (int y = 0; y < icon.getHeight(); y++) {
                     oos.writeInt(icon.getRGB(x, y));
                  }
              }
           }
     }

     public void readFromOIS(ObjectInputStream ois) {
           bla = ois.readUTF();
           blub = ois.readUTF();
           if (ois.readBoolean()) {
              int width = ois.readInt();
              int height = ois.readInt();
              int imageType = ois.readInt();
              icon = new BufferedImage(width, height, imageType);
              for (int x = 0; x < width; x++) {
                  for (int y = 0; y < height; y++) {
                      icon.setRGB(x, y, ois.readInt());
                  }
              }
           }
     }
}

Natürlich noch ein bisschen mehr als das hier, aber:
Die Bytes die in die Datei geschrieben werden sind 1:1 die, die auch wieder gelesen werden. Und es werden auch alle Dinge rein geschrieben...

Sehr kurios...
 
S

Spacerat

Gast
flush mache ich, wie ich gerade festgestellt habe, unmittelbar vor dem close(), also nichts schlimmes...
Klar, davon gehe ich aus... aber auf welchen Stream wendest du es an? Das ist wichtig, weil ein "flush()" auf einen FileOutputStream z.B. bewirkt, dass der Puffer in den Hades geleert (leere "flush()"-Implementation des OutputStreams), statt in die Datei geschrieben wird. Hier genügt ein "close()".
Fazit: Das "close()" des ObjectoutputStreams führt "flush()" automatisch aus und danach wird der übergeordnete Stream geschlossen. Versuch' mal ein simples "close()" auf den ObjectOutputStream und lass "flush()" einfach mal weg.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
O Auslesefehler beim ObjectInputStream(Array) Allgemeine Java-Themen 6
P ObjectOutputStream oder ObjectInputStream fehlerhaft? Allgemeine Java-Themen 7
K Input/Output ObjectInputStream.HandleTable OutOfMemory Allgemeine Java-Themen 8
T ObjectInputStream - Arrayliste, die unbekannte Objekte enthält Allgemeine Java-Themen 9
T Klasse in externer JAR mit ObjectInputStream Allgemeine Java-Themen 14
B ObjectInputStream - Wann ist Ende erreicht? Allgemeine Java-Themen 10
J ObjectInputStream und OutOfMemory Allgemeine Java-Themen 10
Zrebna Wieso sollte man Null-Prüfungen nicht mit Optional-Objekten nutzen? Allgemeine Java-Themen 13
kodela Textfeld nicht rechteckig Allgemeine Java-Themen 10
G Doppelklick auf Javaprogramm klapt nicht Allgemeine Java-Themen 1
W Timer terminiert nicht Allgemeine Java-Themen 5
D Linux, Java-Version wird nicht erkannt bzw. welche Einstellung fehlt noch? Allgemeine Java-Themen 19
W Überflüssige Deklaration vermeiden...war da nicht mal was? Allgemeine Java-Themen 3
N lwjgl kann textureSampler nicht finden Allgemeine Java-Themen 4
P Fehler: Hauptklasse Main konnte nicht gefunden oder geladen werden Ursache: java.lang.ClassNotFoundException: Main Allgemeine Java-Themen 24
S Java Programm lässt sich vom USB-Stick starten, aber nicht von HDD Allgemeine Java-Themen 16
T .Jar kann man nicht ausführen Allgemeine Java-Themen 18
P JDK nicht installiert in Net Object Fusion Allgemeine Java-Themen 7
D Image bewegt sich nicht nach Klicken auf Button Allgemeine Java-Themen 15
N Regex schlägt nicht an Allgemeine Java-Themen 10
Y Wieso krieg ich die Unit Tests nicht hin Allgemeine Java-Themen 55
D Erste Schritte Mp3 Datei kann nicht von der Festplatte geöffnet werden - mit ChatGPT erstellt Allgemeine Java-Themen 7
G Popup wird nicht sichtbar Allgemeine Java-Themen 9
8u3631984 Funktions Parameter mit Lombok "NonNull" annotieren wird in Jacococ Testcoverage nicht herausgefiltert Allgemeine Java-Themen 3
kodela String kann nicht zu Pfad konvertiert werden Allgemeine Java-Themen 16
M Apache Proxy Weiterleitung auf Tomcat funktioniert nicht wie gewünscht Allgemeine Java-Themen 1
Momo16 Brauche Hilfe - Java Projekt kann nicht erstellt werden Allgemeine Java-Themen 12
OnDemand ApacheCommon FTP Client zuckt nicht Allgemeine Java-Themen 3
T JavaPoet - (noch) nicht existente Typen Allgemeine Java-Themen 2
E Es ist nicht möglich, eine Batch-Anweisung auszuführen. Allgemeine Java-Themen 9
C Was passt hier nicht bei der Calendar-Class Allgemeine Java-Themen 2
T Testing JUnit5: try ... catch arbeitet nicht sauber Allgemeine Java-Themen 6
W While Schleife funktioniert nicht ganz Allgemeine Java-Themen 4
OnDemand MemoryLeak nicht zu finden Allgemeine Java-Themen 26
torresbig Website login Problem - Jsoup, wie bisher, klappt nicht! Allgemeine Java-Themen 31
H do-while Schleife funktioniert nicht wie ich es möchte Allgemeine Java-Themen 7
ERlK JDA Code funktioniert nicht? Allgemeine Java-Themen 4
OnDemand Ram Freigabe erfolgt nicht nach Prozessende Allgemeine Java-Themen 18
OnDemand XML desializing Attribute bringt nicht erwartetes Ergebnis Allgemeine Java-Themen 16
T ImageIcon wird nicht angezeigt Allgemeine Java-Themen 6
N JAVA-Code mit Grafikfenster zeichnet in Windows, aber nicht Mac. Allgemeine Java-Themen 4
stormyark TikTakToe funktioniert nicht Allgemeine Java-Themen 10
N Warum wird die For Schleife nicht betreten Allgemeine Java-Themen 4
Tiago1234 Hauptklasse konnte nicht gefunden oder geladen werden Allgemeine Java-Themen 38
T Remove bei ArrayList funktioniert nicht Allgemeine Java-Themen 2
M Map<String,String>funktioniert nicht richtig Allgemeine Java-Themen 4
I "Neues" Lizenzmodell Oracle - JRE nicht mehr zur Redistribution freigegeben? Allgemeine Java-Themen 16
J c Programm läuft nicht in compilierter Version des Java Projektes Allgemeine Java-Themen 7
A code wird nicht ausgeführt Allgemeine Java-Themen 3
Blender3D Alte Beiträge nicht mehr vorhanden Allgemeine Java-Themen 6
M Warum hat Java dieses und jenes nicht... Allgemeine Java-Themen 8
W Bilder werden in App mit Jar-Datei nicht angezeigt Allgemeine Java-Themen 15
Micha43 Applet *.jar läuft nicht auf dem Mac Allgemeine Java-Themen 8
M Warum bekommen ich den Result nicht ? Allgemeine Java-Themen 17
Kiki01 Häufigster Buchstabe lässt sich nicht ermitteln Allgemeine Java-Themen 30
OnDemand RegEx /compilebekomme nicht die erwarteten Werte Allgemeine Java-Themen 9
HerrBolte Seltsamer Fehler nur in der Windows- und nicht in der Java-Console O_O Allgemeine Java-Themen 16
P String.replace() funktioniert nicht? Allgemeine Java-Themen 3
N nicht einsehbarer Fehler im code, kann nicht mehr übersetzten Allgemeine Java-Themen 51
P Karate API Test läuft nicht durch . initializationError Allgemeine Java-Themen 21
N nicht static und auch nicht new Allgemeine Java-Themen 3
Z macOS java konnte nicht entfernt werden xpc verbindungsfehler Allgemeine Java-Themen 4
T Schaltfläche wird nicht gefunden Allgemeine Java-Themen 4
boschl2000 Springerproblem-Implementierung funktioniert nicht richtig Allgemeine Java-Themen 1
F Getter Methode aufrufen funktioniert nicht Allgemeine Java-Themen 1
N Gierigen Regex in nicht-gierigen umwandeln Allgemeine Java-Themen 4
N Regulärer Ausdruck funktioniert nicht Allgemeine Java-Themen 6
AleXusher Hauptklasse startlösung konnte nicht gefunden oder geladen werden Allgemeine Java-Themen 1
G @PostConstruct Annotation nicht mehr gültig ? Allgemeine Java-Themen 7
L Objekte in Set nicht gefunden Allgemeine Java-Themen 13
T Projekt baut nicht mehr/lässt sich nicht mehr ausführen Allgemeine Java-Themen 6
izoards log4j2 will nicht.... Allgemeine Java-Themen 15
Tobero Meine Funktion für das beinhalten eines Punktes in einem Kreis funktioniert nicht Allgemeine Java-Themen 5
1Raini Java if-Abfrage funktioniert nicht! Allgemeine Java-Themen 3
D Firebase retrieve data Problem, Child Element wird nicht angesprochen Allgemeine Java-Themen 0
I serialVersionUID - explizit vergeben oder nicht? Allgemeine Java-Themen 6
MiMa Vorhandenes das nicht existiert?? Allgemeine Java-Themen 7
LimDul Hä? Lambda-Ausdruck geht, Methoden-Referenz nicht Allgemeine Java-Themen 8
O Jar lässt sich auf bestimmten Pc nicht starten Allgemeine Java-Themen 18
T Fremde Typen mockt man nicht? Allgemeine Java-Themen 3
Killunox MaxHeap Zuweisung unter Linux funktioniert nicht Allgemeine Java-Themen 1
LimDul Direktes return eines Array geht nicht Allgemeine Java-Themen 20
B neuroph hält beim XOR lernen nicht an Allgemeine Java-Themen 13
kodela JDialog zeigt Text nicht an Allgemeine Java-Themen 5
Dann07 Java-Programm findet DLLs nicht! Allgemeine Java-Themen 20
D Twitch API mit HttpURLConnection läuft nicht? Allgemeine Java-Themen 0
M Test geht auf Travis und mit Github Action schief aber nicht lokal Allgemeine Java-Themen 3
R Threads Clip loop loopt nicht Allgemeine Java-Themen 2
Dann07 MP3 Datei abspielen funktioniert nicht Allgemeine Java-Themen 6
W Server-Thread schreibt nicht alle Dateien Allgemeine Java-Themen 6
OnDemand JMS Messages nicht abgeholt Allgemeine Java-Themen 0
O Aus JAR-Datei erstellte EXE-Datei funktioniert nicht Allgemeine Java-Themen 10
A Mp3 Player funktioniert nicht Allgemeine Java-Themen 0
W String -> byte[] -> String - Sieht jemand was ich nicht sehe? Allgemeine Java-Themen 10
M Console geht nicht auf (Windows 10) Allgemeine Java-Themen 3
J Hilfe, Jar Datei kann nicht ausgeführt werden Allgemeine Java-Themen 2
W Enumeration ein Array/List als Eigenschaft mitgeben - warum geht das nicht? Allgemeine Java-Themen 0
W Javac nicht bei Installation installiert Allgemeine Java-Themen 9
S HTML den ich von einer URL hole nicht identisch mit dem HTML im Browser Allgemeine Java-Themen 1
S Java.exe exestiert, aber irgendwie auch nicht Allgemeine Java-Themen 11

Ähnliche Java Themen

Neue Themen


Oben