Android中意外的StreamTokenizer行为

时间:2011-11-03 23:52:15

标签: java android

我遇到了这个奇怪的问题:相同的代码在Native Java中产生的结果与在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());

给定以下Inputstream(从文件中读取)

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

Native 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 Emulator和Android 4.0 Emulator上获得相同的结果。我也尝试在真实设备上运行它,我也得到了相同的结果。

1 个答案:

答案 0 :(得分:2)

基本上,Android StreamTokenizer实现搞砸了。通过查看源代码,nextToken()解析前一个nextToken()读取的字符,除非它是流中的第一个字符。就我而言,'['字符已被第3 nextToken()个读取。调用第4 nextToken()时,读取数字4但打印'['。然后read()按预期读取']'。然后第五个nextToken()打印出'4',它已经被第4个nextToken()读入,并且继续这样。因此,鉴于当前的实现,不能将read()nextToken()混合在一起。