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 split
método String
ou o java.util.regex
pacote.
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 String
que eu quero dividir, é quase um acéfalo para acompanhar split()
.