Verständnisfrage/Problem beim lesen mit ObjectInputStream

  • Themenstarter Themenstarter exi
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
E

exi

Gast
Hallo,

vorab verrate ich einmal, daß ich früher fleißig in Java war, dann aber zwei Jahre pausiert habe. Und nun seit wenigen Tagen wieder mit Java übe... und andauernd über Details aus anderen Sprachen stolpere. Wahrscheinlich steht mir momentan auch mein Vorwissen im Weg...

Mein Problem ist nur die Frage wie ich wiederholt eine (selbstgebastelte) Datei lesen und die vorgefundenen Daten in Objekten sichern kann. Konkret: wie generiere ich eine Wiederholungsschleife if(!eof), if-nicht-End-of-File?Wobei mir Tips aus Büchern und dem Netz bisher nur wenig geholfen haben. Es gibt *keine* Methode eof(), gut, hier habe ich wohl noch Pascal, C++ oder Fortran im Kopf. Meine Quellen nennen als Alternative die Methode read(), welches das fokusierte Byte erfasst und dahin gehend überprüft ob es noch existiert.

Angelegt hatte ich die Datei mit:
Code:
private void speicherAktion(final String ziel) {
        try {
            FileOutputStream fstream = new FileOutputStream(new File(ziel));
            ObjectOutputStream stream = new ObjectOutputStream(fstream);
            for (int i=0; i<Datenliste.size(); i++) stream.writeObject( (myFarbelement)(Datenliste.get(i)) );
            stream.close();
	}
	catch(java.io.FileNotFoundException ex){System.out.println("File not found error: "+ex);}
	catch(java.io.IOException ex){System.out.println("IOException error: "+ex);}
    }
myFarbelement ist dabei serialisiert und besteht aus je drei Integer. Effektiv lese ich eine Landkarte pixelweise ein, vermerke Längengrad, Breitengrad und die Pixelfarbe. Alle meine Punkte (etwa 10000 Stück) sammle ich in einer ArrayList um dann in obiger speicherAktion jeden einzelnen Datensatz zu sichern.Klappt problemlos.
Mein Problem ist das Einlesen in einem neuen Programm.
Code:
    private void LeseQuellDatei() {
        Quellliste=new ArrayList();
        File cfg = new File(Quelle.getText());
        
        if (cfg.exists()) {
            InputStream fis = null;
            try { 
                fis = new FileInputStream( cfg ); 
                ObjectInputStream o = new ObjectInputStream( fis ); 
                System.out.println("o.read= "+o.read());

//                while (o.read()!=-1) {
                    myFarbelement puffer = (myFarbelement) o.readObject();
                    Quellliste.add(puffer);
//                }
            } 
            catch ( IOException e ) { System.err.println( e ); } 
            catch ( ClassNotFoundException e ) { System.err.println( e ); } 
            finally { try { fis.close(); } catch ( Exception e ) { } }
        } else System.out.println(" Fehler! Quelldatei "+cfg+" existiert nicht! ");    
    }
Wobei diese auskommentierte Version noch funktioniert. Ich bekomme ein (1) Element eingelesen, dieses wird richtig gecastet und kannz.B. zum zeichnen eines Rechteckes verwendet werden.
Nur ist o.read() konsequent auf dem Wert -1! Die von der Literatur empfohlene Wiederholungsschleife wird nicht einmal betreten.
Eine feste Anzahl kann ich nicht vorgeben (will das Programm variabel halten), das mir im Kopf herumschwirrende EOF gibt es nicht, und irgendwie sehe ich vor lauter Bäumen den Wald nicht mehr.

Habt ihr mir irgendwelche Tips? Oder seht ihr mein Verständnisproblem?

danke
exi[/code]
 
nach einem groben Blick in die API
http://java.sun.com/javase/6/docs/api/java/io/ObjectInputStream.html
scheint wiederholtes Lesen bis zu einer EOFException ein normales Vorgehen zu sein,
aber lies dir das vielleicht nochmal selber durch,
in Lehrbüchern müsste es bei dem jeweiligen Thema doch auch stehen?

-------

ob read() geht kann ich nicht sagen, sieht ja nicht so aus,
aber sei froh, wenn mit read ein einzelnes Byte fehlen würde, wie soll dann das nächste Objekt korrekt gelesen werden? 😉
 
Hallo SlaterB,

SlaterB hat gesagt.:
nach einem groben Blick in die API
http://java.sun.com/javase/6/docs/api/java/io/ObjectInputStream.html
scheint wiederholtes Lesen bis zu einer EOFException ein normales Vorgehen zu sein,
aber lies dir das vielleicht nochmal selber durch,
in Lehrbüchern müsste es bei dem jeweiligen Thema doch auch stehen?

-------

ob read() geht kann ich nicht sagen, sieht ja nicht so aus,
aber sei froh, wenn mit read ein einzelnes Byte fehlen würde, wie soll dann das nächste Objekt korrekt gelesen werden? 😉


danke für deine Einschätzung. Der Hinweis "scheint wiederholtes Lesen bis zu einer EOFException ein normales Vorgehen zu sein" ist zwar gruselig, grausig, eine Schande für jede ordentliche Programmiersprache, und ein absichtlicher Sprung über eine Klippe um deren Ende zu finden... aber tatsächlich: so klappt es.
Code:
            InputStream fis = null;
            try { 
                fis = new FileInputStream( cfg ); 
                ObjectInputStream o = new ObjectInputStream( fis ); 
                while (true) {  //--> huch! so was lese ich gar nicht gerne, da winkt doch die Endlosschleife :-)
                    myFarbelement puffer = (myFarbelement) o.readObject();
                    Quellliste.add(puffer);
                }
            } 
            catch ( IOException e ) { System.err.println( e ); } 
            catch ( ClassNotFoundException e ) { System.err.println( e ); } 
            finally { try { fis.close(); } catch ( Exception e ) { } }

Die API-Spezifikation behandelt leider nur den einfachen Fall bei dem ein Wert gelesen wird. Das war für mich gestern&heute ein Grund Bücher zu wälzen und im Netz zu recherchieren. Z.B. JavaIstNurEineInsel (http://www.galileocomputing.de/open...13_001.htm#mj5c3809c0318cfba5c2be67ad74adea6b) oder Programmiergrundlagen (http://www.abyter.de/java4-2.htm). Aber genau dort bin ich auf das Abfragen über read() gestoßen.

Nun ist jedenfalls mein Problem gelöst. Und ich wurde ganz direkt mit der Tatsache konfrontiert, daß Java eben doch anders als C++ ist. ;-)

danke
exi
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben