Guía rápida de Java StringTokenizer

1. Información general

En este artículo rápido, exploraremos una clase fundamental en Java: StringTokenizer .

2. StringTokenizer

La clase StringTokenizer nos ayuda a dividir Strings en varios tokens.

StreamTokenizer proporciona una funcionalidad similar, pero el método de tokenización es mucho más simple que el utilizado por la clase StreamTokenizer . Los métodos de StringTokenizer no distinguen entre identificadores, números y cadenas entre comillas, ni reconocen ni omiten comentarios.

El conjunto de delimitadores (los caracteres que separan los tokens) se puede especificar en el momento de la creación o por token.

3. Usando el StringTokenizer

El ejemplo más simple de usar StringTokenizer será dividir una Cadena según delimitadores especificados.

En este ejemplo rápido, vamos a dividir el argumento String y agregar los tokens en una lista :

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

Observe cómo estamos dividiendo la cadena en la lista de tokens según el delimitador ' , '. Luego en el ciclo, usando el método tokens.add () ; estamos agregando cada token a ArrayList.

Por ejemplo, si un usuario ingresa como " Bienvenido, a, baeldung.com ", este método debe devolver una lista que contenga un fragmento de tres palabras como " Bienvenido ", " a " y " baeldung.com ".

3.1. Enfoque Java 8

Dado que StringTokenizer implementa la interfaz Enumeration , podemos usarla con la interfaz Colecciones de J ava .

Si consideramos el ejemplo anterior, podemos recuperar el mismo conjunto de tokens usando el método Collections.list () y la API Stream :

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

Aquí, estamos pasando el StringTokenizer en sí mismo como un parámetro en el método Collections.list () .

El punto a tener en cuenta aquí es que, dado que la Enumeración es un tipo de Objeto , necesitamos convertir los tokens al tipo String (es decir, depende de la implementación; si usamos List of Integer / Float, entonces necesitaremos convertir con Integer / Float ).

3.2. Variantes de StringTokenizer

StringTokenizer viene con dos constructores sobrecargados junto al constructor predeterminado: StringTokenizer (String str) y StringTokenizer (String str, String delim, boolean returnDelims):

StringTokenizer (String str, String delim, boolean returnDelims) toma unaentrada booleana adicional. Si elvalor booleano es verdadero , StringTokenizer considera el delimitador como un token y lo agrega a su grupo interno de tokens.

StringTokenizer (String str) es un atajo para el ejemplo anterior; internamente llama al otro constructor con delimitador codificado como ”\ t \ n \ r \ f” y el valor booleano como falso.

3.3. Personalización de tokens

StringTokenizer también viene con un método nextToken () sobrecargado que toma un fragmento de cadena como entrada. Este fragmento de cadena actúa como un conjunto adicional de delimitadores; según los tokens que se reorganizan nuevamente.

Por ejemplo, si podemos pasar ' e ' en el método nextToken () para romper aún más la cadena en función del delimitador ' e ':

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

Por lo tanto, para una cadena dada de ' Hola, baeldung.com ', produciremos los siguientes tokens:

H llo ba ldung.com

3.4. Longitud del token

Para contar la cantidad de tokens disponibles, podemos usar el método de tamaño de StringTokenizer :

int tokenLength = tokens.size();

3.5. Leyendo desde archivo CSV

Ahora, intentemos usar StringTokenizer en un caso de uso real.

Hay escenarios en los que intentamos leer datos de archivos CSV y analizar los datos en función del delimitador proporcionado por el usuario.

Usando StringTokenizer , podemos llegar allí fácilmente:

public List getTokensFromFile( String path , String delim ) { List 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; }

Aquí, la función toma dos argumentos; uno como nombre de archivo CSV (es decir, leído de la carpeta resources [src -> main -> resources] ) y el otro como delimitador.

Según estos dos argumentos, los datos CSV se leen línea por línea, y cada línea se tokeniza usando StringTokenizer .

Por ejemplo, hemos incluido el siguiente contenido en el CSV:

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

Por lo tanto, se deben generar los siguientes tokens:

1 IND India 2 MY Malaysia 3 AU Australia

3.6. Pruebas

Ahora, creemos un caso de prueba rápido:

public class TokenizerTest { private MyTokenizer myTokenizer = new MyTokenizer(); private List expectedTokensForString = Arrays.asList( "Welcome" , "to" , "baeldung.com" ); private List expectedTokensForFile = Arrays.asList( "1" , "IND" , "India" , "2" , "MY" , "Malaysia" , "3", "AU" , "Australia" ); @Test public void givenString_thenGetListOfString() { String str = "Welcome,to,baeldung.com"; List actualTokens = myTokenizer.getTokens( str ); assertEquals( expectedTokensForString, actualTokens ); } @Test public void givenFile_thenGetListOfString() List actualTokens = myTokenizer.getTokensFromFile( "data.csv", " }

4. Conclusión

En este tutorial rápido, echamos un vistazo a algunos ejemplos prácticos del uso del núcleo Java StringTokenizer .

Como siempre, el código fuente completo está disponible en GitHub.