Der BufferedReader mag mich nicht

Messoras

Aktives Mitglied
Hallo,
Ich bin's wieder und immernoch mit dem gleichen Projekt...
Ich versuche momentan die Speicherstände meines Spiels aus einer Datei in einen String zu schreiben und den dann zu einer Klasse zu machen.
Mein Problem ist die größe der Datei... Sie hat ca. 1000 Zeilen und die sind randvoll.
Deshalb habe ich versucht sie alle nacheinander an den String anzuhängen, undzwar so:
Java:
   FileReader fr = new FileReader(dateien[i]); //dateien[i] ist vorher definiert.
   BufferedReader br = new BufferedReader(fr);
   String info = "";
   String zeile = "";

   while((zeile = br.readLine()) != null) {
       info += zeile;
       System.out.println("Zeile angehängt");
   }
   System.out.println("Info gelesen");
   br.close();
Sollte ja eigentlich kein Problem sein, aber der BufferedReader macht nur 2 Zeilen.
Die Konsole zeigt mir an:
Code:
Zeile angehängt
Info gelesen
Fehler beim Lesen der Speicherstände
Der "Fehler beim Lesen der Speicherstände" kommt daher, dass die Nachfolgende Deklaration der Speicherstand Methode mit dem unvollständigen String arbeitet.
Eigentlich sollte der BufferedReader ja solange neue Zeilen lesen, bis keine mehr da sind, aber warum macht er das nur ein mal?
 
Zuletzt bearbeitet:

VfL_Freak

Top Contributor
Moin,

sie auf den ersteb Blick ok aus ... aber:
was ist "dateien" ???:L
was steht denn in der Datei ???:L
Vielleicht nur eine Zeile ???:L :eek:

BTW: ein Konstrukt in der Art
Java:
myString += anotherString
ist generell keine gute Idee, da hierbei jedesmal neue Stringinstanzen erzeugt werden!
Nimm' besser einen Stringbuilder!
Java:
StringBuilder myString = new StringBuilder;
...
myString.append( anotherString );

Gruß
Klaus
 

taro

Bekanntes Mitglied
was gibt dir ein
Java:
System.out.println(zeile)

vor
Java:
info += zeile;
aus?
 

taro

Bekanntes Mitglied
Ich habs dann doch mal kurz getestet ... funktioniert wie es soll ...

woher kommt eigentlich

Code:
Fehler beim Lesen der Speicherstände
?

Hantierst du evtl. da noch mit irgendwas anderem?

Wo fängst du FileNotFoundException und IOException ab?
 
Zuletzt bearbeitet:

Messoras

Aktives Mitglied
Also... Einmal die gesamte Methode hier:
Java:
laden = true;
            machknopf("Zurück",getWidth()/2-30,140,60,20,"ladenstopp");
            int zaehler = 0;
            //Provisorisch
            //             speicherstaende.toFirst();
            //             while (speicherstaende.hasAccess()) {
            //                 Speicherstand bla = (Speicherstand) speicherstaende.getObject();
            //                 machknopf(bla.name,getWidth()/2-90,175+zaehler,180,20,"laden/"+bla.name);
            //                 zaehler += 35;
            //                 speicherstaende.next();
            //             }

            //Laden aus Datei
            File path = new File("main/saves");
            File[] dateien = path.listFiles();
            //Hier werden die Speicherstände auf 0 gesetzt!
            speicherstaende = new List();

            for (int i = 0; i < dateien.length; i++) {
                try {

                    FileReader fr = new FileReader(dateien[i]);
                    BufferedReader br = new BufferedReader(fr);
                    String info = "";
                    String zeile = "";

                    while((zeile = br.readLine()) != null) {
                        info += zeile;
                        System.out.println("Zeile angehängt:");
                        System.out.println(zeile);
                    }
                    System.out.println("Info gelesen");
                    br.close();
                    //Konstruktor:String n, Spielfeld m, List k,int x1, int y1
                    //toString: name+"#"+x+"#"+y+"#"+map.toString()+"#"+kis
                    //toString Zeug//
                    Speicherstand sps = new Speicherstand(info);
                    System.out.println("Speicherstand erstellt");
                    speicherstaende.append(sps);
                    System.out.println("Speicherstand an Liste angehängt");
                    machknopf(sps.name,getWidth()/2-90,175+zaehler,180,20,"laden/"+sps.name);
                    zaehler += 35;
                }

                catch(Exception e) {
                    System.out.println("Fehler beim Lesen der Speicherstände");
                }
            }
Sry was die Ausgabe angeht, aber:
Der Text, den Sie eingegeben haben, besteht aus 529420 Zeichen und ist damit zu lang. Bitte kürzen Sie den Text auf die maximale Länge von 25000 Zeichen.

Jedenfalls wird nur die oberste Zeile der Datei eingelesen.

#EDIT:
Gibt es so eine Art Längenbegrenzung für Strings? Denn die wäre mit einer halben Millionen Zeichen denke ich überschritten, aber wenn das ein normales array aus chars ist ohne begrenzung dürfte der ja an die Grenze von int gehen, also.... ehm 2.147.483.647,
zumindest sollte er mehr als nur die erste Zeile erreichen.

Achja das Error Terminal gibt
Code:
Exception in thread "AWT-EventQueue-0" java.lang.OutOfMemoryError: Java heap space
aus, also liegt das an dem unvollendeten String.
 
Zuletzt bearbeitet:

Topfpflanze

Gesperrter Benutzer
Exception in thread "AWT-EventQueue-0" java.lang.OutOfMemoryError: Java heap space

bedeutet schlicht und einfach, dass Java keinen Speicher mehr hat.
Den Java verfügbaren Speicher kannst du einfach mittels eines Kommandozeilenparameters erhöhen.
 

Messoras

Aktives Mitglied
Oh Gott bin ich dämlich... Da erkenne ich das simple Wort memory aus 50cm Entfernung nicht... :lol:
Danke, dass du mich drauf hingewiesen hast.
Wie mache ich das denn mit dem Kommandozeilenparameter? muss ich da direkt mit einem char Array arbeiten und dann mit BufferedReader.read() einen anhängen? Wie bestimme ich die Größe für das Array?
 
Zuletzt bearbeitet:

Messoras

Aktives Mitglied
Also ich habe es jetzt so probiert, aber ich bekomme immernoch ne OutOfMemory Exception:
Java:
laden = true;
            machknopf("Zurück",getWidth()/2-30,140,60,20,"ladenstopp");
            int zaehler = 0;
            //Provisorisch
            //             speicherstaende.toFirst();
            //             while (speicherstaende.hasAccess()) {
            //                 Speicherstand bla = (Speicherstand) speicherstaende.getObject();
            //                 machknopf(bla.name,getWidth()/2-90,175+zaehler,180,20,"laden/"+bla.name);
            //                 zaehler += 35;
            //                 speicherstaende.next();
            //             }

            //Laden aus Datei
            File path = new File("main/saves");
            File[] dateien = path.listFiles();
            //Hier werden die Speicherstände auf 0 gesetzt!
            speicherstaende = new List();

            for (int i = 0; i < dateien.length; i++) {
                try {

                    FileReader fr = new FileReader(dateien[i]);
                    BufferedReader br = new BufferedReader(fr);
                    java.lang.StringBuilder info = new StringBuilder();
                    String zeile = "";

                    while((zeile = br.readLine()) != null) {
                        info.append(zeile);
                        System.out.println("Zeile angehängt:");
                    }
                    System.out.println("Info gelesen");
                    br.close();
                    //Konstruktor:String n, Spielfeld m, List k,int x1, int y1
                    //toString: name+"#"+x+"#"+y+"#"+map.toString()+"#"+kis
                    //toString Zeug//
                    //String name0 = info.substring(15,info.indexOf("#"));
                    //System.out.println(name0);
                    //Speicherstand sps = new Speicherstand(name0,new Spielfeld("1",10,10,0),k0,x0,y0);
                    Speicherstand sps = new Speicherstand(info.toString());
                    System.out.println("Speicherstand erstellt");
                    speicherstaende.append(sps);
                    System.out.println("Speicherstand an Liste angehängt");
                    machknopf(sps.name,getWidth()/2-90,175+zaehler,180,20,"laden/"+sps.name);
                    zaehler += 35;
                }

                catch(Exception e) {
                    System.out.println("Fehler beim Lesen der Speicherstände");
                }
            }

Übrigens wieder schon nach der ersten Zeile.
 
Zuletzt bearbeitet:

Messoras

Aktives Mitglied
Die Datei ist riesig... Ca 1000 Zeilen, aber der Fehler tritt immer schon nach der ersten Zeile auf.
Das sehe ich an der Konsole, die ausgibt:
Code:
Zeile angehängt:
Info gelesen
 
Zuletzt bearbeitet:

Topfpflanze

Gesperrter Benutzer
Wiviele KiloByte hat deine Datei?

In welcher Programmzeile tritt der Fehler auf?

Er sagt dir doch outofmemory at line...
 
Zuletzt bearbeitet:

Messoras

Aktives Mitglied
Die Dateien haben 514-516 kb, das soll aber auch noch groeßer werden, wenn die Maps sich ausdehnen...
Der Fehler tritt zuerst beim Konstruktor für das dreizigste Feld des Spielfelds oder so auf, wenn er versucht einen substring bis zum nächsten "#" zu machen.

Sollte ich die substrings auch per StringBuilder machen?

^Deshalb dachte ich auch erst es läge nur am unkompletten String
 
Zuletzt bearbeitet:

Topfpflanze

Gesperrter Benutzer
Wenn der Fehler im Konstruktor Auftritt wäre der Quelltext der Klasse vermutlich hilfreich. Zumindest alle Felder & der Konstruktor & alles was vom Konstruktor aufgerufen wird.
 
Zuletzt bearbeitet:

Messoras

Aktives Mitglied
Konstruktor Speicherstand:
Java:
public Speicherstand(String info) {
        //laden aus toString
        name = info.substring(15,info.indexOf("#"));
        String info2 = info.substring(info.indexOf("#")+1);
        x = Integer.parseInt(info2.substring(0,info2.indexOf("#")));
        String info3 = info2.substring(info2.indexOf("#")+1);
        y = Integer.parseInt(info3.substring(0,info3.indexOf("#")));
        String info4 = info3.substring(info3.indexOf("#")+1);
        String mapinfo = info4.substring(info4.indexOf("{Spielfeld}")+11,info4.indexOf("{/Spielfeld}"));
        //System.out.println("Speicherstand erstellt. Ausstehend: Map, Bots");
        map = new Spielfeld(mapinfo);
        String botinfo = info4.substring(info4.indexOf("{Bot}"+5));
        ki = new List();
        boolean h = true;
        while (h) {
            if (botinfo.startsWith("{/Spielfeld}")) {
                h = false;
            }
            else {
                ki.append(new Bot(botinfo));
                botinfo = botinfo.substring(botinfo.indexOf("{/Bot}")+6);
            }
        }

    }

Konstruktor Map:
Java:
public Spielfeld(String info) {
        //System.out.println("Spielfeld wird generiert ...");
        name = info.substring(0,info.indexOf("#"));
        String info2 = info.substring(info.indexOf("#")+1);
        breite = Integer.parseInt(info2.substring(0,info2.indexOf("#")));
        String info3 = info2.substring(info2.indexOf("#")+1);
        hoehe = Integer.parseInt(info3.substring(0,info3.indexOf("#")));
        String info4 = info3.substring(info3.indexOf("#")+1);
        feld = new Feld[breite][hoehe];
        String[][] feldinfo = new String[breite][hoehe];
        //System.out.println("Spielfeld erstellt. Generiert Boden");
        for (int i = 0; i < breite; i++) {
            for (int j = 0; j < hoehe; j++) {
                if (j > 0) {
                    feldinfo[i][j] = feldinfo[i][j-1].substring(feldinfo[i][j-1].indexOf("{/Feld}")+7);
                }
                
                else if (i > 0) {
                    feldinfo[i][j] = feldinfo[i-1][j].substring(feldinfo[i-1][j].indexOf("{/Feld}")+7); 
                }
                else {
                    feldinfo[i][j] = info4;
                }
                //System.out.println("Generiert Feld ["+i+"]["+j+"] ...");
                feld[i][j] = new Feld(feldinfo[i][j]);
                //System.out.println("Feld ["+i+"]["+j+"] generiert");
            }
        }
        //System.out.println("Boden generiert");
    }

Konstruktor Feld:
Java:
public Feld(String info) {
        //System.out.println("Feld wird generiert ...");
        name = info.substring(info.indexOf("{Feld}"+6,info.indexOf("#")));
        String info2 = info.substring(info.indexOf("#")+1);
        String isvoll = info2.substring(0,info2.indexOf("#"));
        voll = false;
        if (isvoll.equals("true")) {
            voll = true;
        }
        String info3 = info2.substring(info2.indexOf("#")+1);
        farbe = farbeaustext(info3);
        String flaecheninfo = info3.substring(info3.indexOf("#")+1);
        //System.out.println("Feld generiert. Ausstehend: Flaeche");
        flaeche = new Flaeche(flaecheninfo);
    }

Konstruktor Flaeche:
Java:
public Flaeche (String info) {
        //System.out.println("Flaeche wird generiert ...");
        name = info.substring(9,info.indexOf("#"));
        //System.out.println("Flaeche - Namen geladen");
        String info2 = info.substring(info.indexOf("#")+1);
        xPos = Integer.parseInt(info2.substring(0,info2.indexOf("#")));
        //System.out.println("Flaeche - X geladen");
        String info3 = info2.substring(info2.indexOf("#")+1);
        yPos = Integer.parseInt(info3.substring(0,info3.indexOf("#")));
        //System.out.println("Flaeche - Y geladen");
        String info4 = info3.substring(info3.indexOf("#")+1);
        breite = Integer.parseInt(info4.substring(0,info4.indexOf("#")));
        //System.out.println("Flaeche - Breite geladen");
        String info5 = info4.substring(info4.indexOf("#")+1);
        hoehe = Integer.parseInt(info5.substring(0,info5.indexOf("{/Flaeche}")));
        //System.out.println("Flaeche - Hoehe geladen");
        //System.out.println("Flaeche generiert.");
    }

Konstruktor Bot:
Java:
public Bot (String info) {
        name = info.substring(info.indexOf("{Bot}")+5,info.indexOf("#"));
        String info2 = info.substring(info.indexOf("#")+1);
        callback = info2.substring(0,info2.indexOf("#"));
        String info3 = info2.substring(info2.indexOf("#")+1);
        warten = Integer.parseInt(info3.substring(0,info3.indexOf("#")-1));
        String feldinfo = info3.substring(info3.indexOf("#")+1);
        feld = new Feld(feldinfo);
    }

Die Variablen, die gesetzt werden spielen denke ich keine große Rolle, deswegen habe ich die jetzt nicht großartig erleutert.
 

Topfpflanze

Gesperrter Benutzer
HAst du dir mal das Array feldInfo angeschaut?
Ich glaube, dass feldinfo[0][0] die Info für ALLE Felder enthält,
feldinfo[1][0] die info für (ALLE-1) Felder enthält...

Da dürfte dein ganzer Speicher hin verschwinden
 

Topfpflanze

Gesperrter Benutzer
Du könntest zum beispiel nur in einem Array nur die startindexe speichern, anstatt der gesamten strings, und von denen aus suchen (indexOf kann auch erst ab einem bestimmten Zeichen suchen)

Alternativ kannst du den ganzen String in die einzelnen Felddefinitionen zerlegen (Schau dir String.split an)

Alternativ, womit du auf so ziemlich alles verzichten kannst: XStream - Two Minute Tutorial
Dann hast du nurnoch deine Objekte, ohne die ganze String-Verarbeitung, und xstream liest und schreibt deine objekte. Allerdings dann in XML.
 
Zuletzt bearbeitet:

Messoras

Aktives Mitglied
Das mit den Startindexen verstehe ich nicht so ganz, aber diese xStream Geschichte sieht praktisch aus. Ich versuche mal mir das zu installieren.

Geht das mit splitString so:
Java:
String[] felderinfo = info4.split("{/Feld}{Feld}"+7);
?

->
Java:
public Spielfeld(String info) {
        //System.out.println("Spielfeld wird generiert ...");
        name = info.substring(0,info.indexOf("#"));
        String info2 = info.substring(info.indexOf("#")+1);
        breite = Integer.parseInt(info2.substring(0,info2.indexOf("#")));
        String info3 = info2.substring(info2.indexOf("#")+1);
        hoehe = Integer.parseInt(info3.substring(0,info3.indexOf("#")));
        String info4 = info3.substring(info3.indexOf("#")+1);
        feld = new Feld[breite][hoehe];
        //String[][] feldinfo = new String[breite][hoehe];
        //System.out.println("Spielfeld erstellt. Generiert Boden");
        String[] felderinfo = info4.split("{/Feld}{Feld}"+7);
        int zaehler = 0;
        for (int i = 0; i < breite; i++) {
            for (int j = 0; j < hoehe; j++) {
                feld[i][j] = new Feld(felderinfo[zaehler]);
                zaehler++;
                //System.out.println("Feld ["+i+"]["+j+"] generiert");
            }
        }
        //System.out.println("Boden generiert");
    }

So kriege ich zwar keine OutOfMemory Meldung, aber immernoch "Fehler beim Lesen der Speicherstände"
 
Zuletzt bearbeitet:

Harry Kane

Top Contributor
Müssen deine Spielstand-Dateien normale, mit einem Texteditor lesbare Dateien sein?
Wenn nein, würde ich mir mal DataOutput/InputStream anschauen.
 

Messoras

Aktives Mitglied
Müssten sie eigentlich nicht und ich hatte auch erst gedacht, dass ich das am besten mit so einer ini Datei oder so hinkriege, dann habe ich es aber doch mit Textdateien gemacht, weil mir das irgendwie leichter fällt, auch wenn es länger dauert.
 

Messoras

Aktives Mitglied
Das Programm bleibt bei mir genau bei
Java:
String[] felderinfo = info4.split("{/Feld}{Feld}"+7);
hängen, allerdings sagt das Errorterminal nichts, ich sehe nur meine Fehlermeldung "Fehler beim Lesen der Speicherstände"
 
Zuletzt bearbeitet:

Harry Kane

Top Contributor
Das Programm bleibt bei mir genau bei
Java:
String[] felderinfo = info4.split("{/Feld}{Feld}"+7);
hängen, allerdings sagt das Errorterminal nichts, ich sehe nur meine Fehlermeldung "Fehler beim Lesen der Speicherstände"
Das ist doch genau das, was du in deinem Codeschnipsel aus Post #12 programmiert hast? :bahnhof:
Wenn du eine aussagefähige Fehlermeldung möchtest, dann lass dir doch einfach den stack trace ausgeben.
 
Zuletzt bearbeitet:

Topfpflanze

Gesperrter Benutzer
Java:
catch(Exception e) {
    System.out.println("Fehler beim Lesen der Speicherstände");
}

Füg da mal ein e.printStackTrace() ein.
Dann siehst du auch den Fehler.
 

Messoras

Aktives Mitglied
Also der StackTrace gibt folgendes aus:
Code:
java.util.regex.PatternSyntaxException: Illegal repetition
{/Feld}{Feld}7
and der Stelle, wo steht
Java:
String[] felderinfo = info4.split("{/Feld}{Feld}"+7);
 
Zuletzt bearbeitet:

Topfpflanze

Gesperrter Benutzer
Als erstes, die +7 ist überflüssig.
Als zweites das was du der funktion gibst ist ein sogenannter Regulärer Ausdruck (Regex), probiere mal
Java:
info4.split(Pattern.quote("{/Feld}{Feld}"));
 

Messoras

Aktives Mitglied
Cannot find symbol - variable Pattern

Btw. Die +7 ist nicht unwichtig, weil ich das ja zwischen {/Feld} und {Feld} splitten will und nicht vor {/Feld}.
 
Zuletzt bearbeitet:

turtle

Top Contributor
catch(Exception e) {
System.out.println("Fehler beim Lesen der Speicherstände");
}
So etwas ist extrem SCHLECHTER Programmierstil!

Warum?

  1. Du catched ALLE Exceptions, obwohl ich derzeit "nur" sehe, das dein Code FileNotFoundException und IOException werfen könnte. Also solltest du auch nur diese catchen.
  2. Du unterdrückst hilfreiche Informationen. Beispielsweise wäre es bei einer FileNotFoundException doch ganz interessant, um welche Datei es sich handelt. Du aber machst nur System.out.println("Fehler beim Lesen der Speicherstände");
  3. Zum Exception-Handling gehört, nun ja, das du die Exception behandelst. Und das blosse Ausgeben ist KEINE Behandlung. Wenn du da nichts Gescheites machen kannst, ist es besser, diese zu werfen,nicht zu catchen und den Aufrufer sich darum kümmern zu lassen.

Aktuell solltest du auf jeden Fall ALLE Informationen ausgeben, so das du und wir nicht raten müssen.;)

Java:
} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
 
Zuletzt bearbeitet:

turtle

Top Contributor
Sehe, das wohl ein Problem mit regulären Ausdruck vorliegt.
Java:
String[] felderinfo = info4.split("{/Feld}{Feld}"+7);
Da benötigen wir (natürlich) den Inhalt von info4 und deine Erwartung, wie der Split aussehen soll?
 

Messoras

Aktives Mitglied
info4 ist ein sehr langer String, der alle Felder, mit deren toString Methode hintereinander hängt.
Die sieht ca so aus:
Code:
{Feld}2:40#false#java.awt.Color[r=50,g=200,b=20]#{Flaeche}feldflaeche2:40#20#400#10#10{/Flaeche}{/Feld}

Der ganze info4 String also dann so:
Code:
{Feld}Spielerspawn#false#java.awt.Color[r=255,g=255,b=255]#{Flaeche}spawnflaeche#0#0#10#10{/Flaeche}{/Feld}{Feld}0:1#false#java.awt.Color[r=50,g=200,b=20]#{Flaeche}feldflaeche0:1#0#10#10#10{/Flaeche}{/Feld}{Feld}0:2#false#java.awt.Color[r=50,g=200,b=20]#{Flaeche}feldflaeche0:2#0#20#10#10{/Flaeche}{/Feld}{Feld}0:3#false#java.awt.Color[r=50,g=200,b=20]#{Flaeche}feldflaeche0:3#0#30#10#10{/Flaeche}{/Feld}{Feld}0:4#false#java.awt.Color[r=50,g=200,b=20]#{Flaeche}feldflaeche0:4#0#40#10#10{/Flaeche}{/Feld}{Feld}0:5#false#java.awt.Color[r=50,g=200,b=20]#{Flaeche}feldflaeche0:5#0#50#10#10{/Flaeche}{/Feld}{Feld}0:6#false#java.awt.Color[r=50,g=200,b=20]#{Flaeche}feldflaeche0:6#0#60#10#10{/Flaeche}{/Feld}
...

der Split sollte also ca. so sein:
Code:
feldinfo[0] = "{Feld}Spielerspawn#false#java.awt.Color[r=255,g=255,b=255]#{Flaeche}spawnflaeche#0#0#10#10{/Flaeche}{/Feld}"
feldinfo[1] = "{Feld}0:1#false#java.awt.Color[r=50,g=200,b=20]#{Flaeche}feldflaeche0:1#0#10#10#10{/Flaeche}{/Feld}"
feldinfo[2] = "{Feld}0:2#false#java.awt.Color[r=50,g=200,b=20]#{Flaeche}feldflaeche0:2#0#20#10#10{/Flaeche}{/Feld}"
...
 
Zuletzt bearbeitet:

Harry Kane

Top Contributor
Cannot find symbol - variable Pattern
{/Feld}.
Gemeint ist java.util.regex.Pattern. Da fehlt wohl ein import-statement.
Alternativ kannst du auch die geschweiften Klammern, die in regulären Ausdrücken eine spezielle Bedeutung haben, escapen:
Code:
info4.split("\\{/Feld\\}\\{Feld\\}");
Und was soll da nochmal genau die 7? Das splitten liefert dir lediglich ein array von Strings. Ich sehe nicht wozu man da eine Positionsangabe bräuchte. Wenn du weisst, dass nach dem Splitten einige der Einträge im String array noch führende oder anhängende Zeichen haben, die du nicht brauchst, musst du diese separat entfernen. Oder du entfernst sie aus dem Startstring vor dem splitten. In jedem Fall NICHT im demselben Schritt wie das eigentliche Splitten!
Die Fehlermeldung zeigt ja an, dass Java versucht hat, die Zeichenkette "{/Feld}{Feld}7" zum splitten zu verwenden, was ganz sicher nicht das ist, was du beabsichtigt hattest.
 

taro

Bekanntes Mitglied
Das sieht mir wie "verkapptes" XML aus ... warum nutzt du zur Speicherung nicht ganz simpel eine XML-Struktur?
 

Messoras

Aktives Mitglied
Also ich habe jetzt versucht das mit einem FileOutputStream zu machen, aber da bekomme ich die Fehlermeldung:
Code:
java.io.NotSerializableException: Speicherstand
(Schon beim Speichern)

Der Speichercode:
Java:
knoepfe.toFirst();
            while (knoepfe.hasAccess()) {
                Flaeche co = (Flaeche) knoepfe.getObject();
                if (co.callback.equals("speichernan")) {
                    if (co.name.startsWith(speichertext)) {
                        co.name = speichertext;

                        speichern = false;
                        if (speichertext.length()>0) {
                            if (anzeige.equals("spiel")) {
                                Speicherstand speicherstand0 = new Speicherstand(speichertext,aktuell,bots,aktuell.spawnX,aktuell.spawnY);
                                //speicherstaende.append(speicherstand0);
                                Knopfcallback("speichernstopp");
                                text = "Karte "+speichertext+" gespeichert.";
                                textzeit = 100;
                                try {
                                    FileOutputStream fos = new FileOutputStream(path+speichertext+".msav");
                                    ObjectOutputStream oos = new ObjectOutputStream(fos);
                                    oos.writeObject(speicherstand0);
                                    fos.close();
                                    oos.close();
                                } catch (IOException e) {
                                    e.printStackTrace();
                                    System.out.println("Fehler beim Speichern in Datei.");
                                }
                                speichertext = "";
                            }
                            else if (anzeige.equals("editor")) {
                                Speicherstand speicherstand0 = new Speicherstand(speichertext,edited,edibots,edited.spawnX,edited.spawnY);
                                //speicherstaende.append(speicherstand0);
                                Knopfcallback("speichernstopp");
                                text = "Karte "+speichertext+" gespeichert.";
                                textzeit = 100;
                                try {
                                    FileOutputStream fos = new FileOutputStream(path+speichertext+".msav");
                                    ObjectOutputStream oos = new ObjectOutputStream(fos);
                                    oos.writeObject(speicherstand0);
                                    fos.close();
                                    oos.close();
                                } catch (IOException e) {
                                    e.printStackTrace();
                                    System.out.println("Fehler beim Speichern in Datei.");
                                }
                                speichertext = "";
                            }
                        }
                        else {
                            text = "Ungültiger Name.";
                            textzeit = 100;
                        }
                    }
                }
                knoepfe.next();
            }

Der Ladecode:
Java:
laden = true;
            machknopf("Zurück",getWidth()/2-30,140,60,20,"ladenstopp");
            int zaehler = 0;

            //Laden aus Datei
            File path = new File("main/saves");
            File[] dateien = path.listFiles();
            //Hier werden die Speicherstände auf 0 gesetzt!
            speicherstaende = new List();

            for (int i = 0; i < dateien.length; i++) {
                try {
                    FileInputStream fis = new FileInputStream(dateien[i]);
                    ObjectInputStream ois = new ObjectInputStream(fis);
                    Object obj = ois.readObject();
                    speicherstaende.append((Speicherstand)obj);
                }
                catch (IOException e) {
                    e.printStackTrace();
                }
                catch (ClassNotFoundException e) {
                    e.printStackTrace();
                }
            }

#EDIT: Jetzt habe ich bei Speicherstand einfach ein implements Serializable angehängt, aber dann bekomme ich
Code:
java.io.NotSerializableException: List
und von der List habe ich den Code nicht...
 
Zuletzt bearbeitet:

turtle

Top Contributor
Das ist doch eine eindeutige Fehlermeldung, oder?
Sie sagt, das deine Klasse Speicherstand NICHT serialisiert werden kann.

Du solltest mal ein kleines Programm schreiben, das versucht einen Speicherstand zu serialisieren.

Das liegt zu 99,99% daran, das Attribute in deiner Klasse drin sind, die nicht serialisiert werden können.
So kannst du an deiner Klasse rumschrauben, bis die Serialisierung funktioniert.

Und klar kannst du eine List NICHT serialisieren, denn List ist ein Interface.

Ob du eine Implementierung (ArrayList?) serialisieren kannst, ist natürlich auch davon abhängig, welche Objekte in der List stecken.

PS: Und natürlich hast du den Quellcode von List, weil der in src.zip des JDK steht;)
 
Zuletzt bearbeitet:

Messoras

Aktives Mitglied
Also da wäre einmal die Liste, weil ich da keinen Code von habe... Kann ich das nicht irgendwie umgehen?
Und 2. die Klasse Feld. Die gibt zwar keine Fehler beim übersetzen aus, aber sagt nurnoch "Compiling..."
und nichtmehr "Class compiled. No syntax errors":
Java:
import java.awt.*;
public class Feld implements java.io.Serializable
{
    public Flaeche flaeche;
    private boolean voll;
    public String name;
    private Color farbe;
    public Feld(String info) {
        System.out.println("Feld wird generiert ...");
        name = info.substring(info.indexOf("{Feld}"+6,info.indexOf("#")));
        System.out.println("Namen festgelegt.");
        String info2 = info.substring(info.indexOf("#")+1);
        String isvoll = info2.substring(0,info2.indexOf("#"));
        voll = false;
        if (isvoll.equals("true")) {
            voll = true;
        }
        String info3 = info2.substring(info2.indexOf("#")+1);
        farbe = farbeaustext(info3);
        String flaecheninfo = info3.substring(info3.indexOf("#")+1);
        System.out.println("Feld generiert. Ausstehend: Flaeche");
        flaeche = new Flaeche(flaecheninfo);
    }

    public Color farbeaustext(String s) {
        //java.awt.Color[r=50,g=200,b=20]
        int r = Integer.parseInt(s.substring(s.indexOf("r=")+2,s.indexOf("g=")-1));
        int g = Integer.parseInt(s.substring(s.indexOf("g=")+2,s.indexOf("b=")-1));
        int b = Integer.parseInt(s.substring(s.indexOf("b=")+2,s.indexOf("]")));
        return (new Color(r,g,b));
    }

    public Feld(String n, Flaeche f, boolean v) {
        name = n;
        flaeche = f;
        voll = v;
        farbe = Color.white;
    }

    public Feld(String n, Flaeche f, boolean v, Color frb) {
        name = n;
        flaeche = f;
        voll = v;
        farbe = frb;
    }

    public boolean isVoll() {
        return voll;
    }

    public boolean drinnen(int x0,int y0) {
        return (passt(x0,y0,flaeche));
    }
    
    public boolean passt(int x1, int y1, Flaeche f) {
        boolean h = false;
        if (x1 > f.getX() && x1 < f.getX() + f.getBreite() && y1 > f.getY() && y1 < f.getY() + f.getHoehe()) {
            h = true;
        }
        return h;
    }

    public String toString() {
        String isvoll = "false";
        if (voll) {isvoll = "true";}
        return ("{Feld}"+name+"#"+isvoll+"#"+farbe+"#"+flaeche.toString()+"{/Feld}");
    }
}

Inzwischen compiled aber nurnoch die Klasse Flaeche richtig...
Jetzt, nachdem ich das Projekt gespeichert habe, geht's wieder... buggt ein bisschen rum, aber List ist immernoch nicht serializable
 
Zuletzt bearbeitet:

Messoras

Aktives Mitglied
Ich benutze die Liste aus den Abiturvorgaben für 2015 (NRW), weil ich es mit der gelernt habe und mit der am besten klar komme...
 
Zuletzt bearbeitet:

turtle

Top Contributor
Ich verstehe nicht was du machst???:L
Ich habe einen kleinen Test geschrieben, der eine List serialisiert und wieder de-serialisiert. Funzt bei mir problemlos.
Java:
    @Test
    public void test() throws IOException, ClassNotFoundException {
	List list = new List();
	list.add("turtle");
	list.add("Messoras");
	FileOutputStream fos = new FileOutputStream("turtle.ser");
	ObjectOutputStream oos = new ObjectOutputStream(fos);
	oos.writeObject(list);
	fos.close();
	oos.close();

	FileInputStream fin = new FileInputStream("turtle.ser");
	ObjectInputStream ios = new ObjectInputStream(fin);
	List readList = (List) ios.readObject();
	assertEquals(2, readList.getItemCount());
	String[] items = list.getItems();
	assertEquals("turtle", items[0]);
	assertEquals("Messoras", items[1]);
    }
}
 

Messoras

Aktives Mitglied
Wie heisst da die toFirst Methode?
Bzw wie heisst die Methode, die den Index ausgibt?
toFirst wäre ja select(0), oder?
 
Zuletzt bearbeitet:

Messoras

Aktives Mitglied
ES FUNKTIONIERT!!! :D
Ich habe mir den Code von meiner Liste im Internet besorgt und umgeschrieben, jetzt klappt es endlich.
Vielen Dank für eure Hilfe und Motivation!
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
W Socket.setSoTimeout -> BufferedReader -> Default value Allgemeine Java-Themen 4
kodela Unterschiedliches Verhalten von BufferedReader Allgemeine Java-Themen 3
D BufferedReader bricht nach 1248 Iterationen ab Allgemeine Java-Themen 14
C BufferedReader/BufferedWriter schreibt nicht alle Bytes Allgemeine Java-Themen 2
C TCP Server und BufferedReader Leerstring im Stream? Allgemeine Java-Themen 5
A BufferedReader ohne System.in Allgemeine Java-Themen 9
J BufferedReader Datei einlesen Allgemeine Java-Themen 8
C Threading mit BufferedReader/InputStream & sockets Allgemeine Java-Themen 0
J BufferedReader OutOfMemory umgehen? Allgemeine Java-Themen 10
B Input/Output BufferedReader Allgemeine Java-Themen 3
O BufferedReader von ganz unten anfangen zu lesen Allgemeine Java-Themen 7
S BufferedReader/PrintWriter an einer HTML Allgemeine Java-Themen 6
M BufferedReader: Vom Logfile zur Datenbank Allgemeine Java-Themen 6
S Null Pointer Exception bei BufferedReader Allgemeine Java-Themen 4
K BufferedReader.readLine erkennt Zeilenende nicht Allgemeine Java-Themen 11
D 'InputStreamReader' & 'BufferedReader' führen zu "cannot find symbol"-Fehler Allgemeine Java-Themen 3
D Scanner leer aber bufferedReader nicht?! Allgemeine Java-Themen 2
A bufferedReader readline, encoding Allgemeine Java-Themen 5
V wie bufferedreader.readline() unterbrechen? Allgemeine Java-Themen 4
Developer_X Java BufferedReader mit URL Allgemeine Java-Themen 5
D BufferedREader#readLine Allgemeine Java-Themen 20
Semox Fehler - Zuweisung aus BufferedReader an Variable Allgemeine Java-Themen 3
S Exception beim BufferedReader Allgemeine Java-Themen 3
J BufferedReader br.readLine(); Allgemeine Java-Themen 22
G getFilePointer in BufferedReader? Allgemeine Java-Themen 2
D (BufferedReader) inLine() "verschluckt" zeilen ? Allgemeine Java-Themen 2
M BufferedReader.read(char[] cbuf) liefert falsche Werte? Allgemeine Java-Themen 4
W Frage zu BufferedReader Allgemeine Java-Themen 2
conan2 BufferedReader.readLine() von anderem Thread aus beenden Allgemeine Java-Themen 4
K Wie kann ich einen BufferedReader beschleunigen? Allgemeine Java-Themen 4
N readLine() von BufferedReader hält das Programm fest/auf! Allgemeine Java-Themen 10
B while mit BufferedReader beenden Allgemeine Java-Themen 5
F Zu große Werte beim byteweisen Lesen mit BufferedReader.read Allgemeine Java-Themen 5
S BufferedReader problem Allgemeine Java-Themen 11
D BufferedReader in image umwandeln Allgemeine Java-Themen 3
M BufferedReader input - hängt sich auf Allgemeine Java-Themen 4
C Probleme mit URL und BufferedReader Allgemeine Java-Themen 6
C BufferedReader oder DataInputStream Allgemeine Java-Themen 4
M Store a String in a BufferedReader Allgemeine Java-Themen 2
M Welche Umgebung und Frameworks für mich als Umsteiger Allgemeine Java-Themen 6
P String ärgern mich Allgemeine Java-Themen 8
H URLConnection - Es wurmt mich :-/ Allgemeine Java-Themen 4
U Kann mich nicht entscheiden! Allgemeine Java-Themen 5
P JMF macht mich verrückt Allgemeine Java-Themen 3
P Ist Java überhaupt das Richtige für mich? Allgemeine Java-Themen 7
medic NullPointer verwirrt mich total. Allgemeine Java-Themen 3
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

Ähnliche Java Themen

Neue Themen


Oben