2011-11-03 48 views
5

Tôi đang gặp sự cố kỳ quái này: cùng một mã tạo ra các kết quả khác nhau trong Native Java so với Android.Hành vi StreamTokenizer không mong đợi trong 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()); 

Với InputStream sau (đọc từ một tập tin)

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

Native Java in ra

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

như mong đợi. Nhưng trong Android tôi nhận được:

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

Tại sao nó hoạt động khác trong Java Android? Trong Android, bằng cách nào đó, ký tự ']' được lấy ra từ luồng trước khi tokenizer đến đó. Tôi đã đọc tài liệu Java và tài liệu Android và các lớp đó dường như giống nhau.

Cấp API của tôi được đặt thành 7. Và tôi đã thử trên cả Trình giả lập Android 2.1 và Trình mô phỏng Android 4.0 nhận được kết quả tương tự. Tôi cũng đã thử chạy nó trên một thiết bị thực tế và tôi đã nhận được kết quả tương tự là tốt.

Trả lời

2

Về cơ bản, việc triển khai Android StreamTokenizer bị rối tung lên. Từ khi xem mã nguồn, nextToken() phân tích cú pháp ký tự được đọc trước đó nextToken() trừ khi đó là ký tự đầu tiên trong luồng. Trong trường hợp của tôi, ký tự '[' đã được đọc bởi số nextToken() thứ ba. Khi sốđược gọi, số 4 được đọc nhưng '[' được in. Sau đó, read() đọc ']' như mong đợi. Sau đó, số nextToken() in ra số '4' đã được đọc trong sốthứ 4 và tiếp tục như vậy. Vì vậy, với việc triển khai hiện tại, không thể kết hợp cả read()nextToken() với nhau.

Các vấn đề liên quan