Kurzanleitung zum Java StringTokenizer

1. Überblick

In diesem kurzen Artikel werden wir eine grundlegende Klasse in Java untersuchen - den StringTokenizer .

** 2. StringTokenizer

**

Die StringTokenizer -Klasse hilft uns, Strings in mehrere Token aufzuteilen. **

StreamTokenizer bietet ähnliche Funktionen, die Tokenisierungsmethode ist jedoch viel einfacher als die von den https://docs verwendeten. oracle.com/javase/8/docs/api/java/io/StreamTokenizer.html[ StreamTokenizer ]Klasse. Die Methoden von StringTokenizer unterscheiden nicht zwischen Bezeichnern, Zahlen und Strings in Anführungszeichen und erkennen und überspringen auch Kommentare.

Der Satz von Trennzeichen (die Zeichen, die Token trennen) kann entweder zum Zeitpunkt der Erstellung oder auf Token-Basis angegeben werden.

3. Verwenden des StringTokenizer

Das einfachste Beispiel für die Verwendung von StringTokenizer ist das Aufteilen eines String basierend auf angegebenen Trennzeichen.

In diesem schnellen Beispiel teilen wir das Argument String auf und fügen die Token zu einer Liste hinzu _: _ +

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;
}

Beachten Sie, wie wir den String in die Liste der Token aufteilen, die auf dem Trennzeichen " " basieren Dann in der Schleife mit tokens.add () Methode; Wir fügen jedes Token in die ArrayList ein.

Wenn ein Benutzer beispielsweise eine Eingabe als " Welcome, to baeldung.com " eingibt, sollte diese Methode eine Liste mit einem aus drei Wörtern bestehenden Fragment als " Welcome ", " to " und " baeldung.com " zurückgeben.

3.1. Java 8-Ansatz

Da StringTokenizer die Enumeration <Object> -Schnittstelle implementiert, können wir sie mit der Collections -Schnittstelle von J _ava _ verwenden.

Wenn wir das vorherige Beispiel betrachten, können wir dieselbe Gruppe von Token mithilfe der Collections.list () -Methode und der Stream -API abrufen:

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

Hier übergeben wir den StringTokenizer selbst als Parameter in der Collections.list () - Methode.

  • Beachten Sie Folgendes: Da Enumeration ein Object -Typ ist, müssen wir die Token in String -Typ ** umwandeln (dh hängt von der Implementierung ab. Wenn wir List von Integer/Float verwenden, müssen wir sie eingeben -cast mit Integer/Float ).

** 3.2. Varianten von StringTokenizer

**

StringTokenizer enthält neben dem Standardkonstruktor zwei überladene Konstruktoren: StringTokenizer (String str) und StringTokenizer (String str, String delim, boolean returnDelims):

  • StringTokenizer (String str, String delim, boolean returnDelims) ** benötigt eine zusätzliche boolean -Eingabe. Wenn der boolean -Wert true ist, betrachtet StringTokenizer das Trennzeichen selbst als Token und fügt es seinem internen Pool an Token hinzu.

  • StringTokenizer (String str) ** ist eine Verknüpfung für das vorige Beispiel. Intern wird der andere Konstruktor mit einem fest codierten Trennzeichen als "\ t \ n \ r \ f" und dem booleschen Wert als false. aufgerufen.

3.3. Token-Anpassung

StringTokenizer enthält auch eine überladene nextToken () - Methode, die ein String-Fragment als Eingabe verwendet. Dieses String -Fragment dient als zusätzlicher Satz von Trennzeichen. basierend darauf, welche Token wieder reorganisiert werden.

Wenn wir beispielsweise ' e ' in der nextToken () - Methode übergeben können, um die Zeichenfolge basierend auf dem Trennzeichen ' e ' weiter zu brechen

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

Daher werden für eine bestimmte Zeichenfolge von " Hello, baeldung.com " folgende Marken erzeugt:

H
llo
ba
ldung.com

** 3.4. Tokenlänge

**

Um die Anzahl der verfügbaren Token zu zählen, können Sie die StringTokenizer ’s size -Methode verwenden:

int tokenLength = tokens.size();

3.5. Aus CSV-Datei lesen

Versuchen wir nun StringTokenizer in einem echten Anwendungsfall

Es gibt Szenarien, in denen wir versuchen, Daten aus CSV-Dateien zu lesen und die Daten basierend auf dem vom Benutzer angegebenen Trennzeichen zu analysieren.

Mit StringTokenizer können wir problemlos dorthin gelangen:

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;
}

Hier nimmt die Funktion zwei Argumente an; einen als CSV-Dateinamen (d. h. aus dem Ressourcenordner [src → main → resources] ) und den anderen als Trennzeichen.

Basierend auf diesen zwei Argumenten werden die CSV-Daten Zeile für Zeile gelesen und jede Zeile wird mit StringTokenizer tokenisiert.

Wir haben zum Beispiel folgenden Inhalt in die CSV aufgenommen:

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

Daher sollten folgende Token generiert werden:

1
IND
India
2
MY
Malaysia
3
AU
Australia

3.6. Testen

Nun erstellen wir einen schnellen Testfall:

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. Fazit

In diesem kurzen Tutorial haben wir uns einige praktische Beispiele für die Verwendung des Kerns Java StringTokenizer angesehen.

Wie immer ist der vollständige Quellcode verfügbar: over auf GitHub .