2011-11-03 11 views
5

Sto riscontrando questo bizzarro problema: lo stesso codice produce risultati diversi in Native Java che in Android.Comportamento imprevisto di StreamTokenizer in Android

InputStreamReader reader = new InputStreamReader(in, "UTF-8"); 
BufferedReader m_reader = new BufferedReader(reader); 
StreamTokenizer m_tokenizer = new StreamTokenizer(m_reader); 
m_tokenizer.nextToken(); 
System.out.println(m_tokenizer.toString()); 
m_tokenizer.nextToken(); 
System.out.println(m_tokenizer.toString()); 
m_tokenizer.nextToken(); 
System.out.println(m_tokenizer.toString()); 
m_tokenizer.nextToken(); 
System.out.println(m_tokenizer.toString()); 
int c = m_reader.read(); 
System.out.println(c); 
m_tokenizer.nextToken(); 
System.out.println(m_tokenizer.toString()); 
m_tokenizer.nextToken(); 
System.out.println(m_tokenizer.toString()); 

Dato il seguente InputStream (leggere da un file)

(;FF[4]CA[UTF-8] 

nativo Java stampa i

Token['('], line 1 
Token[';'], line 1 
Token[FF], line 1 
Token['['], line 1 
52 
Token[']'], line 1 
Token[CA], line 1 

come previsto. Ma in Android ho ottenuto:

Token['('], line 1 
Token[';'], line 1 
Token[FF], line 1 
Token['['], line 1 
93 
Token[n=4.0], line 1 
Token[CA], line 1 

Perché si comporta in modo diverso in Android Java? In Android, in qualche modo, il carattere ']' viene estratto dallo stream prima che il tokenizzatore arrivi. Ho letto documenti Java e documenti Android e quelle classi sembrano essere identiche.

Il mio livello API è impostato su 7. E ho provato sia su Android 2.1 Emulator che su Android 4.0 Emulator ottenendo lo stesso risultato. Ho anche provato a eseguirlo su un dispositivo reale e ho ottenuto lo stesso risultato.

risposta

2

In pratica, l'implementazione di Android StreamTokenizer è incasinata. Dall'esame del codice sorgente, nextToken() analizza il carattere letto dallo nextToken() precedente, a meno che non sia il primo carattere nello stream. Nel mio caso, il carattere "[" è già stato letto dal 3 ° nextToken(). Quando viene chiamato il, viene letto il numero 4 ma viene stampato "[". Quindi read() legge ']' come previsto. Quindi ilstampa "4" già letto dal 4 nextToken() e continua così. Pertanto, data l'attuale implementazione, non è possibile combinare insieme read() e nextToken().

Problemi correlati