Давайте начнем с устранения StringTokenizer. Он стареет и даже не поддерживает регулярные выражения. В его документации говорится:
StringTokenizerявляется устаревшим классом, который сохраняется по соображениям совместимости, хотя его использование не рекомендуется в новом коде. Всем, кто ищет эту функцию, рекомендуется использовать splitметод Stringили java.util.regexпакет.
Итак, давайте выбросим это прямо сейчас. Это оставляет split()и Scanner. Какая разница между ними?
Во-первых, split()просто возвращает массив, что упрощает использование цикла foreach:
for (String token : input.split("\\s+") { ... }
Scanner построен больше как поток:
while (myScanner.hasNext()) {
String token = myScanner.next();
...
}
или
while (myScanner.hasNextDouble()) {
double token = myScanner.nextDouble();
...
}
(У него довольно большой API , поэтому не думайте, что он всегда ограничен такими простыми вещами.)
Этот интерфейс в стиле потока может быть полезен для анализа простых текстовых файлов или ввода с консоли, когда у вас нет (или вы не можете получить) всех вводимых данных перед началом анализа.
Лично я могу вспомнить только один раз, когда использовал Scannerшкольные проекты, когда мне приходилось получать пользовательский ввод из командной строки. Это делает такую операцию легкой. Но если у меня есть то, Stringчто я хочу разделить, это почти легкое дело split().