2016-09-07 1 views
1

Ich habe ein Stück Code, der seit Jahren bis heute funktioniert. Nach dem Debugging wurde mir klar, dass das letzte Token nicht korrekt erfasst wurde. Ich denke, ist wegen seiner Länge (mehr als 10k Chars).Hat StringTokenizer eine maximale Länge auf Token?

Code:

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

Ich habe versucht, ich nehme ein Token der Länge 20000 aus einem 'StringTokenizer' ohne es zu verkürzen. Da muss etwas mehr los sein. –

Antwort

4

Sie verwenden die StringTokenizer falsch. Ihr Tokenizer wird nicht wie erwartet unter "&&&&&&&" aufgeteilt, sondern unter '&', da nur ein Zeichen von Ihrem Trennzeichen String benötigt wird, um Token zu begrenzen. Es verwirft dann leere Token, weshalb Sie das erwartete Ergebnis trotzdem erhalten haben. Zum Beispiel:

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

Diese Drucke:

a 
b 
c 

So ist mein Verdacht gibt es eine & irgendwo in dir 10k Token. Wenn das der Fall sein könnte, schlage ich vor, dass der Vorschlag von msaint, der String.split() verwendet, der richtige Weg ist, wenn Sie es sich leisten können, Ihren alten Code zu ändern.

1

API scheint keine Einschränkung in Bezug auf die Länge zu haben. Ich habe versucht, deinen Fall zu reproduzieren und konnte nicht erfolgreich sein. Ich konnte 7 Mega Chars vom stringtokenizer bekommen. Sie können zuerst Ihre Zeichenfolge überprüfen und dann versuchen split als stringtokenizer ist eine Legacy-Klasse.

+1

In der Tat sagen die Docs "StringTokenizer" ist eine Legacy-Klasse, die aus Kompatibilitätsgründen beibehalten wird, obwohl ihre Verwendung in neuem Code entmutigt wird. Es wird empfohlen, dass jeder, der diese Funktionalität sucht, stattdessen die Split-Methode von 'String' oder' 'java.util.regex' 'verwendet." –