2011-11-03 2 views
5

이 이상한 문제가 발생합니다. 같은 코드가 Android보다 Native 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] 

기본 자바

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에서 다르게 동작하는 이유는 무엇입니까? 안드로이드에서, 어떻게 든 문자 ']'가 토크 나이저에 도착하기 전에 스트림에서 꺼내집니다. 나는 자바 문서와 안드로이드 문서를 읽었고 그 클래스들은 동일하게 보인다.

내 API 레벨이 7로 설정되었습니다. Android 2.1 에뮬레이터와 Android 4.0 에뮬레이터에서 동일한 결과를 얻으려고했습니다. 또한 실제 장치에서 실행 해 보았습니다. 동일한 결과를 얻었습니다.

답변

2

기본적으로 Android StreamTokenizer 구현은 엉망입니다. nextToken()은 소스 코드를보고 나서 스트림의 첫 번째 문자가 아닌 한 이전 nextToken()으로 읽은 문자를 구문 분석합니다. 제 경우에는 '['문자는 이미 제 3 자 nextToken()에 의해 읽혀집니다. 네 번째 nextToken()이 호출되면 숫자 4가 읽히지 만 '['가 인쇄됩니다. 그런 다음 read()은 예상대로 ']'을 읽습니다. 그러면 5 번째 nextToken()은 이미 4 번째 nextToken()에 의해 읽혀진 '4'를 출력하고 계속 그렇게합니다. 따라서 현재 구현에서는 read()nextToken()을 함께 사용할 수 없습니다.

관련 문제