2016-09-07 1 views
1

오늘까지 수년간 작업 해 온 코드 조각이 있습니다. 디버깅 후 나는 마지막 토큰이 올바르게 수집되지 않는다는 것을 깨달았습니다. 나는 그의 길이 때문에 (10k 이상)라고 생각합니다.StringTokenizer의 토큰 길이는 최대입니까?

코드 :

StringTokenizer tokens = new StringTokenizer(myString,"&&&&&&&"); 
(...) 
String s=tokens.nextToken(); 
//Do something with s 
s=tokens.nextToken(); 
//Do something with s 
s=tokens.nextToken(); 
//Do something with s 

//Now it's time of last and biggest token 
s=tokens.nextToken(); // --> s does not contain entire string 
+0

나는 StringTokenizer에서 20000 길이의 토큰을 줄이지 않고 토큰을 가져왔다. 더 많은 일이 일어나야합니다. –

답변

4

StringTokenizer을 잘못 사용하고 있습니다. 귀하의 토크 나이저는 "&&&&&&&"에서 예상대로 분열하지 않지만 '&'에 토큰을 구분하기 위해 구분 기호 문자열에서 한 문자 만 필요하기 때문에 분열하지 않습니다. 그런 다음 빈 토큰을 버립니다. 따라서 어쨌든 예상되는 결과를 얻을 수 있습니다.

StringTokenizer tokens = new StringTokenizer("a&&b&&c", "&&&"); 
    while (tokens.hasMoreTokens()) { 
     System.out.println(tokens.nextToken()); 
    } 

이 인쇄 : 예를 들어

a 
b 
c 

그래서 내 의심 10,000 토큰이 당신 안에 어딘가에 &가있다. 그럴 경우, String.split()을 사용하는 msaint의 제안은 이전 코드를 수정할 여유가 있다면 갈 수있는 방법입니다.

1

API 길이의 측면에서 제한이없는 것 같다. 나는 당신의 사건을 재현하려고 노력했고 성공할 수 없었습니다. 나는 stringtokenizer에서 7 메가 문자를 얻을 수있었습니다. 문자열을 먼저 확인한 다음 균열문자열 토큰 화인은 레거시 클래스로 사용해보십시오.

+1

사실, "StringTokenizer"는 새로운 코드에서 사용이 권장되지는 않지만 호환성 때문에 보존되는 레거시 클래스입니다. 이 기능을 원하는 사람은'String' 또는'java.util.regex' 패키지의'split' 메소드를 사용하는 것이 좋습니다. " –