2016-05-15 10 views
6

So mache ich Datei-Reader/Writer, die auf eine bestimmte Datei zugreifen und speichern/lesen kann. Ich habe ein Problem beim Lesen aus der Datei. Die Inhalte sind Integer, String und Doppel getrennt durch "|" Trennzeichen. Ich benutze StringTokenizer, um die Token zu trennen und sie an jeder einzelnen Variablen zu speichern, aber wenn ich die Ganzzahlen lese, bekomme ich eine NumberFormatException, obwohl die Zeichenfolge nur ein int enthält. HierNumberFormatException beim Analysieren eines int

ist der Code:

FileReader fr = new FileReader(filename); 
BufferedReader buff = new BufferedReader(fr); 
String line; 

while ((line = buff.readLine()) != null) { 
    StringTokenizer st = new StringTokenizer(line, "|"); 
    while (st.hasMoreElements()) { 
     int Id = Integer.parseInt(st.nextToken()); 
     String Name = st.nextToken(); 
     double cordX = Double.parseDouble(st.nextToken()); 
     double cordY = Double.parseDouble(st.nextToken()); 
    } 
} 

Ein Beispiel Zeile der Datei:

8502113|Aarau|47.391355|8.051251 

Und der Fehler:

java.lang.NumberFormatException: For input string: "8502113" 
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65) 
at java.lang.Integer.parseInt(Integer.java:580) 
at java.lang.Integer.parseInt(Integer.java:615) 
at storage.FileUtilities.readCitiesFromFile(FileUtilities.java:63) 
at basics.Test.main(Test.java:16) 

Fehle ich etwas hier? Verändert StringTokenizer die Zeichenfolge auf eine Art und Weise, die ich nicht kenne?

EDIT: Hier ist der Code, der die Datei erstellt:

FileWriter fw = new FileWriter(filename, !overwrite); // For FileWriter true = append, false = overwrite, so we flip the value. 
    BufferedWriter buff = new BufferedWriter(fw); 
    String coordConvertor; 

    for (int i = 0; i <= cities.size() - 1; i++) { 
     buff.write(Integer.toString(cities.get(i).getId())); 
     buff.write("|"); 
     buff.write(cities.get(i).getName()); 
     buff.write("|"); 
     coordConvertor = Double.toString(cities.get(i).getCoord().getX()); 
     buff.write(coordConvertor); 
     buff.write("|"); 
     coordConvertor = Double.toString(cities.get(i).getCoord().getY()); 
     buff.write(coordConvertor); 
     buff.newLine(); 
+1

Ich kann Ihr Problem nicht reproduzieren. Möglicherweise enthält Ihre Datei einige unsichtbare Zeichen (wie die BOM-Markierung, die normalerweise am Anfang der Datei platziert wird). Lies diesen Teil als String und drücke ihn statt "layout()", um zu sehen, ob die Anzahl der Zeichen mit dem übereinstimmt, was du siehst. – Pshemo

+0

"8502113" enthält 'U + FEFF' Unicode-Zeichen –

+0

@Pshemo Tatsächlich haben Sie Recht. Die Länge scheint +1 zu sein. Wie kann ich das beheben? Gibt es eine Möglichkeit, das zusätzliche Zeichen am Anfang der Datei zu trimmen? EDIT: Die Datei ist eine Standard-TXT-Datei – Akaitenshi

Antwort

3

Es gibt versteckt Unicode-Zeichen im String Ihre abgerufenen mit st.nextToken(). Verwenden Sie diesen Code stattdessen, um sie zu entfernen

int Id = Integer.parseInt(st.nextToken().replaceAll("\\p{C}", "")); 
String Name = st.nextToken().replaceAll("\\p{C}", ""); 
double cordX = Double.parseDouble(st.nextToken().replaceAll("\\p{C}", "")); 
double cordY = Double.parseDouble(st.nextToken().replaceAll("\\p{C}", "")); 
+0

Dies scheint das Problem behoben zu haben, aber ich verstehe nicht, woher kommen diese Unicode-Zeichen? Kannst du auch erklären, was Expression in replaceAll genau macht? – Akaitenshi

+0

Ich habe diese Lösung nur aus [Wie ersetze ich nicht druckbare Unicode-Zeichen in Java] (http://stackoverflow.com/questions/6198986/how-can-i-place-non-printable-unicode-characters-in) -java) – tfosra

+0

Ah ich sehe das war eine große Hilfe danke – Akaitenshi

Verwandte Themen