filereader

  • Themenstarter Themenstarter Guest
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
G

Guest

Gast
hey, ich möchte gerne eine zahl aus einer textdatei auslesen (steht einfach am anfang drin).
in der API find ich nur diese read-methode die einzelne chars einliest, weiss aber nicht wie ich die Zahl als integer irgendwie interpretieren kann:

Code:
FileReader reader = null;
        try {
            reader = new FileReader("highscores.txt");
            String s = new String("");
            for (int c; (c = reader.read()) != -1;) {
                s.concat((char)c + "");
            }
            highscore = Integer.parseInt(s);
        
        } catch (FileNotFoundException ex) {
            highscore = -1;
            
        } finally {
            try {
                reader.close();
            } catch (Exception e) {
            }

Er stürzt sofort ab mit einer ewig langen Fehlerliste, die aufhört mit:

at java.lang.NumberFormatException.forInputString(NumberFormatException.java:48)
at java.lang.Integer.parseInt(Integer.java:468)
at java.lang.Integer.parseInt(Integer.java:497)
 
String s sind immutable; der Aufruf der Methode concat liefert lediglich einen neuen String zurück; am ursprünglichen String-Objekt ändert sich nichts.
Wenn schon, dann also
Code:
s = s.concat( (char)c + "");

Da String#concat aber immer neue String-Objekte erzeugt und Du hier zusätzlich durch das Anfügen des Leerstrings auch noch weitere Objekte anlegst, ist das sicher nicht die effizienteste Lösung.
 
jo hatte ich auch versucht, aber trotzdem fehler:

Exception in thread "AWT-EventQueue-0" java.lang.NumberFormatException: For input string: "123
"
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:48)
at java.lang.Integer.parseInt(Integer.java:456)
at java.lang.Integer.parseInt(Integer.java:497)

zumindest hat er erkannt, dass die Zahl 123 in der textfile steht.

wo isn jetz noch das problem?
 
Der Zeilenwechsel am Ende des Strings (sieht man im Stack-Trace).
Das könntest Du vermeiden, indem die Methode String#trim verwendest:
Code:
highscore = Integer.parseInt(s.trim());
 
aha okay...

is zwar jetzt für meinen Fall total egal, aber du meintest es wäre nicht sehr effizient.
Wie kann man das besser lösen?
 
ungetestet:
Code:
            reader = new FileReader("highscores.txt");
            int highscore = 0;
            for (int c; (c = reader.read()) != -1;) {
                if ( (c <= '0') && ( c >= '9')) {
                  //--- Ziffer gelesen -> bisheriges Ergebnis um eine Stelle nach links
                  //--- verschieben und gerade gelesen Ziffer anhaengen
                  highscore = 10*highscore + ( ((int)c) - ((int)'0'));
                } else {
                   //--- keine Ziffer mehr -> Zahl vollstaendig gelesen
                   break;
                }
            }
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben