2011-11-03 7 views
5

私はこの奇妙な問題に直面しています。同じコードは、AndroidよりもネイティブJavaで異なる結果をもたらします。Androidでの予期せぬStreamTokenizerの動作

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

を考えると、次のInputStream(ファイルから読み込み)予想通り

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

ネイティブJavaは

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

を出力します。しかし、Androidで私は得た:

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

なぜそれはAndroid Javaで動作が違うのですか? Androidでは、トークナイザーがそこに着く前に、何らかの形で文字 ']'がストリームから取り出されます。私はJavaのドキュメントとAndroidのドキュメントを読んでおり、それらのクラスは同じようです。

APIレベルが7に設定されています。Android 2.1エミュレータとAndroid 4.0エミュレータの両方で同じ結果が得られました。私はまた、実際のデバイスでそれを実行しようとしたと私は同様の結果を得た。

答えて

2

基本的に、Android StreamTokenizerの実装は台無しです。 nextToken()は、ソースコードを見ると、それがストリームの最初の文字でない限り、前のnextToken()で読み込まれた文字を解析します。私の場合、 '['文字はすでに第3のnextToken()によって読み取られています。 4番目のnextToken()が呼び出されると、番号4が読み込まれますが、「」が表示されます。その後、read()は ']'を期待どおりに読み取ります。そして、5番目のnextToken()は、すでに4番目のnextToken()で読み込まれている '4'を出力します。現在の実装では、read()nextToken()を混在させることはできません。

関連する問題