Vamos começar eliminando StringTokenizer. Está ficando velho e nem suporta expressões regulares. Sua documentação declara:
StringTokenizeré uma classe herdada que é mantida por motivos de compatibilidade, embora seu uso seja desencorajado em novo código. Recomenda-se que quem procura essa funcionalidade use o splitmétodo Stringou o java.util.regexpacote.
Então, vamos jogar fora imediatamente. Isso sai split()e Scanner. Qual a diferença entre eles?
Por um lado, split()simplesmente retorna uma matriz, o que facilita o uso de um loop foreach:
for (String token : input.split("\\s+") { ... }
Scanner é construído mais como um fluxo:
while (myScanner.hasNext()) {
String token = myScanner.next();
...
}
ou
while (myScanner.hasNextDouble()) {
double token = myScanner.nextDouble();
...
}
(Ele possui uma API bastante grande , não pense que ela está sempre restrita a coisas tão simples.)
Essa interface no estilo de fluxo pode ser útil para analisar arquivos de texto simples ou entrada do console, quando você não possui (ou não pode obter) toda a entrada antes de começar a analisar.
Pessoalmente, a única vez em que me lembro de usar Scanneré em projetos escolares, quando tive que obter informações do usuário na linha de comando. Isso facilita esse tipo de operação. Mas se eu tiver um Stringque eu quero dividir, é quase um acéfalo para acompanhar split().