Cominciamo eliminando StringTokenizer. Sta invecchiando e non supporta nemmeno le espressioni regolari. La sua documentazione afferma:
StringTokenizerè una classe legacy che viene mantenuta per motivi di compatibilità sebbene il suo utilizzo sia sconsigliato nel nuovo codice. Si consiglia a chiunque cerchi questa funzionalità di utilizzare invece il splitmetodo Stringo il java.util.regexpacchetto.
Quindi buttiamolo subito. Che lascia split()e Scanner. Qual è la differenza tra loro?
Per prima cosa, split()restituisce semplicemente un array, il che semplifica l'uso di un ciclo foreach:
for (String token : input.split("\\s+") { ... }
Scanner è costruito più come uno stream:
while (myScanner.hasNext()) {
String token = myScanner.next();
...
}
o
while (myScanner.hasNextDouble()) {
double token = myScanner.nextDouble();
...
}
(Ha un'API piuttosto grande , quindi non pensare che sia sempre limitato a cose così semplici.)
Questa interfaccia in stile stream può essere utile per analizzare semplici file di testo o input della console, quando non hai (o non riesci a ottenere) tutti gli input prima di iniziare l'analisi.
Personalmente, l'unica volta che ricordo di aver usato Scannerè per i progetti scolastici, quando ho dovuto ottenere l'input dell'utente dalla riga di comando. Rende facile questo tipo di operazione. Ma se ne ho uno Stringche voglio dividere, è quasi un gioco da ragazzi split().