Ich habe Probleme mit Filereader eine txt-Datei in ein Array (Java) zu schreiben, was mache ich falsch?

StackOverflow https://stackoverflow.com/questions/2613481

Frage

Scanner s = null;
    try {
        s = new Scanner(new BufferedReader(new FileReader("rates.txt")));
            for (int i=0; i<9; i++){
                while(s.hasNext()){rates[i] = s.next();}
                System.out.println(rates[i]);
            }
    }catch (IOException e){
        System.out.println(e);
    }
    finally {
        if (s != null) {
            s.close();
        }
    }

Wenn ich diesen Code ausführen, liest es das letzte Stück von Zeichen in meiner txt-Datei, legt sie in Raten [0], Stöcke null in 1-9. Ich bin mir nicht sicher, warum es erst am Ende meiner Datei zu lesen. Der Inhalt der txt ist unten ..

USD 1.34

EUR 1.00

JPY 126.28

GBP 0.88

INR 60.20

Es liest die 60,20, die alle ist es in der Anordnung der Aufnahme. Jede Hilfe wäre sehr geschätzt. Ich glaube, ich könnte Ihnen die Ergebnisse dieser Code ausgeführt wird:

run:
60.20
null
null
null
null
null
null
null
null
BUILD SUCCESSFUL (total time: 0 seconds)
War es hilfreich?

Lösung

while(s.hasNext()){rates[i] = s.next();}

In einfachem Englisch, das sagt:. Zwar gibt es Tokens übrig, legen Sie die nächsten Token in rates[i]

So wird es das erste Token in rates[i] setzen, dann das nächste Token in rates[i], dann das nächste Token in rates[i], ..., und schließlich das letzte Token in rates[i]. Da i nicht verändert wird, werden alle Werte in das gleiche Element des Arrays geschrieben, die zuvor gelesenen Werte überschrieben werden.

Andere Tipps

Ich empfehle:

  • Verwenden List anstelle von Array
    • Flexiblere, viel einfacher zu arbeiten mit, nutzt Java Collections Framework, usw.
  • Nicht das Währungssymbol zu speichern und den numerischen Wechselkurs alles in einem Mischbeutel
    • ... aber mit einer Klasse, die das Paar verkapseln
  • Scanner.nextDouble() Mit dem numerischen Wechselkurs lesen (was vermutlich werden Sie wollen double sowieso konvertieren)

So etwas wie folgt aus:

List<ExchangeRate> allRates = new ArrayList<ExchangeRate>();
while (sc.hasNext()) {
    String symbol = sc.next();
    double rate = sc.nextDouble();
    allRates.add(new ExchangeRate(symbol, rate));
}

Beachten Sie, wie:

  • Sie müssen nicht mehr wissen, wie viele Elemente in einem Array zuweisen
  • Das Symbol und die Rate sind alle nicht in eine gemischte Tüte geworfen
  • List.add bedeutet keinen Zähler, dass Sie den Überblick behalten müssen und verwalten
    • d. der Fehler in Ihrer ursprünglichen Frage!

Ich denke, das Problem ist, dass die Leitung 5, die Ihre while-Schleife enthält, liest den gesamten Datei-Eingang. So lesen Sie die gesamte Datei auf dem ersten for Schleifeniterationslatenzzeit wobei i = 0; Das nächste Mal, wenn Ihre for Schleife gibt es nichts zu lesen links.

Sie wollen wahrscheinlich etwas Ähnliches statt:

List rates = new ArrayList();
while (s.hasNext()) {
      rates.add(s.next());
}

Ein weiteres mögliches Problem: FileReader nutzt die Plattform Standard-Kodierung. Dies kann angemessen Prozess vom Benutzer bereitgestellte Dateien, aber wenn die Dateien Teil der Anwendung sind, können sie beschädigt werden, wenn die Anwendung auf einem System mit einer nicht kompatibelen Standard-Codierung ausgeführt wird (und nein, mit nur ASCII-Zeichen funktioniert nicht schützen Sie vollständig gegen diese).

Um das Problem zu vermeiden, verwenden Sie neuen InputStreamReader(new FileInputStream(filename), encoding) statt - und erkennt, dass Sie tatsächlich eine encoding für Ihre Datei auswählen

.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top