Commençons par éliminer StringTokenizer. Il vieillit et ne prend même pas en charge les expressions régulières. Sa documentation indique:
StringTokenizerest une classe héritée qui est conservée pour des raisons de compatibilité bien que son utilisation soit déconseillée dans le nouveau code. Il est recommandé à toute personne recherchant cette fonctionnalité d'utiliser la splitméthode de Stringou le java.util.regexpackage à la place.
Alors jetons-le tout de suite. Cela laisse split()et Scanner. Quelle est la différence entre eux?
D'une part, split()renvoie simplement un tableau, ce qui facilite l'utilisation d'une boucle foreach:
for (String token : input.split("\\s+") { ... }
Scanner est construit plus comme un flux:
while (myScanner.hasNext()) {
String token = myScanner.next();
...
}
ou
while (myScanner.hasNextDouble()) {
double token = myScanner.nextDouble();
...
}
(Il a une API assez volumineuse , alors ne pensez pas qu'elle est toujours limitée à des choses aussi simples.)
Cette interface de style flux peut être utile pour analyser des fichiers texte simples ou des entrées de console, lorsque vous n'avez pas (ou ne pouvez pas obtenir) toutes les entrées avant de commencer l'analyse.
Personnellement, le seul moment où je me souviens avoir utilisé Scannerest pour les projets scolaires, lorsque je devais obtenir les entrées de l'utilisateur à partir de la ligne de commande. Cela facilite ce genre d'opération. Mais si j'ai un Stringque je veux séparer, c'est presque une évidence split().