Guide rapide sur le Java StringTokenizer

1. Vue d’ensemble

Dans cet article rapide, nous allons explorer une classe fondamentale en Java, le StringTokenizer .

** 2. StringTokenizer

**

La classe StringTokenizer nous aide à diviser Strings en plusieurs jetons.

StreamTokenizer fournit des fonctionnalités similaires, mais la méthode de tokenization est beaucoup plus simple que celle utilisée par https://docs . oracle.com/javase/8/docs/api/java/io/StreamTokenizer.html[ StreamTokenizer ]classe. Les méthodes de StringTokenizer ne font pas la distinction entre les identificateurs, les nombres et les chaînes entre guillemets, ni ne reconnaissent et ignorent les commentaires.

L’ensemble de délimiteurs (les caractères séparant les jetons) peut être spécifié au moment de la création ou par jeton.

3. Utiliser le StringTokenizer

L’exemple le plus simple d’utilisation de StringTokenizer consistera à diviser une String en fonction de délimiteurs spécifiés.

Dans cet exemple rapide, nous allons diviser l’argument String et ajouter les jetons à une liste _: _

public List<String> getTokens(String str) {
    List<String> tokens = new ArrayList<>();
    StringTokenizer tokenizer = new StringTokenizer(str, ",");
    while (tokenizer.hasMoreElements()) {
        tokens.add(tokenizer.nextToken());
    }
    return tokens;
}

Remarquez comment nous séparons le String dans la liste des jetons en fonction du délimiteur ' , '. Puis dans la boucle, en utilisant la méthode tokens.add () ; nous ajoutons chaque jeton dans le ArrayList.

Par exemple, si un utilisateur saisit “ Welcome, to, baeldung.com “, cette méthode devrait renvoyer une liste contenant un fragment de trois mots tel que “ Bienvenue “, “ to ” et “ baeldung.com “.

3.1. Approche Java 8

Puisque StringTokenizer implémente l’interface Enumeration <Object> , nous pouvons l’utiliser avec l’interface J _ava ‘s Collections_ .

Si nous considérons l’exemple précédent, nous pouvons récupérer le même ensemble de jetons à l’aide de la méthode Collections.list () et de l’API Stream :

public List<String> getTokensWithCollection(String str) {
    return Collections.list(new StringTokenizer(str, ",")).stream()
      .map(token -> (String) token)
      .collect(Collectors.toList());
}

Ici, nous passons le StringTokenizer lui-même en tant que paramètre dans la méthode Collections.list () .

  • Le point à noter ici est que, puisque Enumeration est un type Object , nous devons transtyper les jetons en type String type ** (c’est-à-dire que cela dépend de l’implémentation; si nous utilisons List of Integer/Float , nous aurons besoin de taper -cast avec Integer/Float ).

** 3.2. Variantes de StringTokenizer

**

StringTokenizer est fourni avec deux constructeurs surchargés à côté du constructeur par défaut: StringTokenizer (String str) et StringTokenizer (String str, String delim, boolean returnDelims):

  • StringTokenizer (String str, String delim, boolean returnDelims) ** prend une entrée boolean supplémentaire. Si boolean valeur est true , alors StringTokenizer considère le délimiteur lui-même comme un jeton et l’ajoute à son pool interne de jetons.

  • StringTokenizer (String str) ** est un raccourci pour l’exemple précédent; elle appelle en interne l’autre constructeur avec un délimiteur codé en dur sous le nom ”\ t \ n \ r \ f” et la valeur booléenne sous le nom false.

3.3. Personnalisation des jetons

StringTokenizer est également livré avec une méthode surchargée nextToken () qui prend un fragment de chaîne en entrée. Ce fragment String agit comme un ensemble supplémentaire de délimiteurs; sur la base de laquelle les jetons sont réorganisés à nouveau.

Par exemple, si nous pouvons passer « e » dans la méthode nextToken () pour rompre davantage la chaîne en fonction du délimiteur « e »:

tokens.add(tokenizer.nextToken("e"));

Par conséquent, pour une chaîne donnée de «Bonjour, baeldung.com__», nous produirons les jetons suivants:

H
llo
ba
ldung.com

** 3.4. Longueur du jeton

**

Pour compter le nombre de jetons disponibles, nous pouvons utiliser la méthode StringTokenizer ’ssize__:

int tokenLength = tokens.size();

3.5. Lecture à partir d’un fichier CSV

Essayons maintenant d’utiliser StringTokenizer dans un cas d’utilisation réel.

Il existe des scénarios dans lesquels nous essayons de lire les données à partir de fichiers CSV et de les analyser en fonction du délimiteur fourni par l’utilisateur.

En utilisant StringTokenizer , nous pouvons facilement y arriver:

public List<String> getTokensFromFile( String path , String delim ) {
    List<String> tokens = new ArrayList<>();
    String currLine = "";
    StringTokenizer tokenizer;
    try (BufferedReader br = new BufferedReader(
        new InputStreamReader(Application.class.getResourceAsStream(
          "/" + path )))) {
        while (( currLine = br.readLine()) != null ) {
            tokenizer = new StringTokenizer( currLine , delim );
            while (tokenizer.hasMoreElements()) {
                tokens.add(tokenizer.nextToken());
            }
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
    return tokens;
}

Ici, la fonction prend deux arguments; l’un en tant que nom de fichier CSV (c’est-à-dire lu dans le dossier resources [src → main → resources] ]) et l’autre en tant que délimiteur.

Sur la base de ces deux arguments, les données CSV sont lues ligne par ligne et chaque ligne est segmentée à l’aide de StringTokenizer .

Par exemple, nous avons mis le contenu suivant dans le fichier CSV:

1|IND|India
2|MY|Malaysia
3|AU|Australia

Par conséquent, les jetons suivants doivent être générés:

1
IND
India
2
MY
Malaysia
3
AU
Australia

3.6. Essai

Créons maintenant un cas de test rapide:

public class TokenizerTest {

    private MyTokenizer myTokenizer = new MyTokenizer();
    private List<String> expectedTokensForString = Arrays.asList(
      "Welcome" , "to" , "baeldung.com" );
    private List<String> expectedTokensForFile = Arrays.asList(
      "1" , "IND" , "India" ,
      "2" , "MY" , "Malaysia" ,
      "3", "AU" , "Australia" );

    @Test
    public void givenString__thenGetListOfString() {
        String str = "Welcome,to,baeldung.com";
        List<String> actualTokens = myTokenizer.getTokens( str );

        assertEquals( expectedTokensForString, actualTokens );
    }

    @Test
    public void givenFile__thenGetListOfString() {
        List<String> actualTokens = myTokenizer.getTokensFromFile(
          "data.csv", "|" );

        assertEquals( expectedTokensForFile , actualTokens );
    }
}

4. Conclusion

Dans ce rapide tutoriel, nous avons examiné quelques exemples pratiques d’utilisation du noyau Java StringTokenizer .

Comme toujours, le code source complet est disponible à l’adresse over sur GitHub .