Кратко ръководство за Java StringTokenizer

1. Общ преглед

В тази бърза статия ще разгледаме основен клас в Java - StringTokenizer .

2. StringTokenizer

В StringTokenizer класа ни помага да се раздели Strings в множество символи.

StreamTokenizer предоставя подобна функционалност, но методът на токенизация е много по-прост от този, използван от класа StreamTokenizer . Методите на StringTokenizer не правят разлика между идентификатори, числа и цитирани низове, нито разпознават и пропускат коментари.

Наборът от разделители (символите, които разделят символите) може да бъде посочен или по време на създаването, или на база на маркер.

3. Използване на StringTokenizer

Най-простият пример за използване на StringTokenizer ще бъде разделянето на String въз основа на определени разделители.

В този бърз пример ще разделим аргумента String и ще добавим маркерите в списък :

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

Забележете как разбиваме String в списъка с символи, базирани на разделител ' , '. След това в цикъла, използвайки метода tokens.add () ; ние добавяме всеки знак в ArrayList.

Например, ако потребителят даде вход като „ Добре дошли, на, baeldung.com “, този метод трябва да върне списък, съдържащ фрагмент от три думи като „ Добре дошли “, „ до “ и „ baeldung.com “.

3.1. Подход на Java 8

От StringTokenizer оръдия Преброяване интерфейс, можем да го използваме с J АВА е Колекции интерфейс.

Ако разгледаме по-ранния пример, можем да извлечем същия набор от маркери, използвайки метода Collections.list () и Stream API:

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

Тук предаваме самия StringTokenizer като параметър в метода Collections.list () .

Тук трябва да се отбележи, че тъй като изброяването е тип обект , трябва да прехвърлим жетоните в тип String (т.е. зависи от изпълнението; ако използваме Списък на цяло число / плаващо число, ще трябва да въведем тип с Integer / Float ).

3.2. Варианти на StringTokenizer

StringTokenizer се предлага с два претоварени конструктора до конструктора по подразбиране: StringTokenizer (String str) и StringTokenizer (String str, String delim, boolean returnDelims):

StringTokenizer (String str, String delim, boolean returnDelims) взема допълнителен булев вход. Ако булевата стойност е вярно , тогава StringTokenizer счита разделител се като знак и да го добавите към своя вътрешен басейн на жетони.

StringTokenizer (String str) е пряк път за предишния пример; вътрешно извиква другия конструктор с твърдо кодиран разделител като "\ t \ n \ r \ f" и булевата стойност като false.

3.3. Персонализиране на токени

StringTokenizer също идва с претоварен метод nextToken () , който приема фрагмент от низ като вход. Този фрагмент от String действа като допълнителен набор от разделители; въз основа на което жетоните се преорганизират отново.

Например, ако можем да предадем ' e ' в метода nextToken () , за да прекъснем допълнително низа въз основа на разделителя ' e ':

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

Следователно, за даден низ от „ Здравейте, baeldung.com “ ще създадем следните символи:

H llo ba ldung.com

3.4. Дължина на токена

За да преброим наличния брой жетони, можем да използваме метода за размер на StringTokenizer :

int tokenLength = tokens.size();

3.5. Четене от CSV файл

Сега, нека опитаме да използваме StringTokenizer в реална употреба.

Има сценарии, при които се опитваме да четем данни от CSV файлове и да анализираме данните въз основа на дадения от потребителя разделител.

Използвайки StringTokenizer , можем лесно да стигнем до там:

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

Тук функцията взема два аргумента; единият като име на CSV файл (т.е. чете се от папката [src -> main -> resources] ), а другият като разделител.

Въз основа на тези два аргумента, CSV данните се четат ред по ред и всеки ред се токенизира с помощта на StringTokenizer .

Например, ние сме поставили следното съдържание в CSV:

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

Следователно трябва да се генерират следните символи:

1 IND India 2 MY Malaysia 3 AU Australia

3.6. Тестване

Сега, нека създадем бърз тестов случай:

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. Заключение

В този бърз урок разгледахме някои практически примери за използване на основния Java StringTokenizer .

Like always, the full source code is available over on GitHub.