2016-05-15 13 views
6

Così sto facendo lettore/scrittore di file che può accedere a un determinato file e salvarlo/leggerlo. Ho un problema durante la lettura dal file. I contenuti sono numeri interi, stringa e doppia separati da "|" Delimitatori. Sto usando StringTokenizer per separare i token e salvarli in ogni singola variabile, ma quando sto leggendo gli interi ottengo un NumberFormatException anche se la stringa contiene solo un int.NumberFormatException durante l'analisi di un int

Ecco il codice:

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()); 
    } 
} 

una riga di esempio del file:

8502113|Aarau|47.391355|8.051251 

E l'errore:

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) 

mi manca qualcosa qui? StringTokenizer sta manomettendo la stringa in un modo che non conosco?

EDIT: Ecco il codice che crea il file:

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

Non riesco a riprodurre il problema. Forse il tuo file contiene alcuni caratteri invisibili (come il BOM solitamente posizionato all'inizio del file). Leggi quella parte come stringa e invece di analizzarla stampa 'length()' per vedere se il numero di caratteri corrisponde a quello che vedi. – Pshemo

+0

"8502113" contengono il carattere Unicode 'U + FEFF' –

+0

@Pshemo In effetti si è corretto. La lunghezza sembra essere +1. Come posso risolvere questo? C'è un modo per tagliare il carattere in più all'inizio del file? EDIT: il file è un file .txt standard – Akaitenshi

risposta

3

Ci sono caratteri Unicode nascosti nel String tua recuperata con st.nextToken(). Utilizzare questo codice per rimuoverli

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

Questo sembra aver risolto il problema ma non capisco da dove vengono questi caratteri unicode? Puoi anche spiegare quale espressione in replaceAll fa esattamente? – Akaitenshi

+0

Ho appena preso quella soluzione da [Come posso sostituire i caratteri Unicode non stampabili in Java] (http://stackoverflow.com/questions/6198986/how-can-i-replace-non-printable-unicode-characters-in -java) – tfosra

+0

Ah, vedo che è stato di grande aiuto grazie – Akaitenshi

Problemi correlati