2016-09-07 44 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 

所以我懷疑是有一個&內某處你10K令牌。如果可能的話,我建議使用String.split()的msaint建議,如果你能負擔得起修改你的舊代碼的話,這是一條路。

1

API似乎在長度方面沒有限制。我試圖重現你的情況,並不能成功。我能夠從stringtokenizer中獲得7個Mega字符。您可以先檢查您的字符串,然後嘗試拆分stringtokenizer是一個遺留類。

+1

事實上,文檔中說「StringTokenizer」是一個遺留的類,爲了兼容性的原因被保留下來,儘管它在新代碼中的使用不受歡迎。建議任何尋求這種功能的人使用'String'的'split'方法或'java.util.regex'包代替。「 –