Comencemos por eliminar StringTokenizer. Se está haciendo viejo y ni siquiera admite expresiones regulares. Su documentación establece:
StringTokenizeres una clase heredada que se retiene por razones de compatibilidad, aunque se desaconseja su uso en nuevos códigos. Se recomienda que cualquiera que busque esta funcionalidad use el splitmétodo Stringo el java.util.regexpaquete en su lugar.
Así que vamos a tirarlo de inmediato. Eso se va split()y Scanner. ¿Cual es la diferencia entre ellos?
Por un lado, split()simplemente devuelve una matriz, lo que facilita el uso de un bucle foreach:
for (String token : input.split("\\s+") { ... }
Scanner se construye más como una secuencia:
while (myScanner.hasNext()) {
String token = myScanner.next();
...
}
o
while (myScanner.hasNextDouble()) {
double token = myScanner.nextDouble();
...
}
(Tiene una API bastante grande , así que no pienses que siempre está restringido a cosas tan simples).
Esta interfaz de estilo de transmisión puede ser útil para analizar archivos de texto simples o entradas de consola, cuando no tiene (o no puede obtener) toda la entrada antes de comenzar a analizar.
Personalmente, el único momento que recuerdo haber usado Scanneres para proyectos escolares, cuando tuve que obtener la entrada del usuario desde la línea de comandos. Hace que este tipo de operación sea fácil. Pero si tengo una con la Stringque quiero separarme, es casi una obviedad split().