У меня есть текстовый файл, который содержит данные, разделенные '|'. Я должен получить каждое поле (разделенный '|') и обработать его. Текстовый файл можно показать как указано ниже:
ABC|DEF || FGHT
Я использую строковый токенизатор (JDK 1.4) для получения каждого значения поля. Теперь проблема, я должен получить пустую строку после DEF.However, я не получаю вакуум между DEF & FGHT.
Мой результат должен быть - ABC, DEF"", FGHT, но я получаю ABC, DEF, FGHT
Из документации StringTokenizer
:
StringTokenizer - это унаследованный класс, который сохраняется по причинам совместимости хотя его использование не рекомендуется в новом коде. Рекомендуется, чтобы те, кто кто ищет эту функциональность, использовать метод split в String или java.util.regex.
Следующий код должен работать:
String s = "ABC|DEF||FGHT";
String[] r = s.split("\\|");
Используйте флаг returnDelims
и проверьте два последующих вхождения разделителя:
String str = "ABC|DEF||FGHT";
String delim = "|";
StringTokenizer tok = new StringTokenizer(str, delim, true);
boolean expectDelim = false;
while (tok.hasMoreTokens()) {
String token = tok.nextToken();
if (delim.equals(token)) {
if (expectDelim) {
expectDelim = false;
continue;
} else {
// unexpected delim means empty token
token = null;
}
}
System.out.println(token);
expectDelim = true;
}
выводит
ABC
DEF
null
FGHT
API некрасивый и поэтому считается устаревшим (т.е. «почти устаревшим»). Используйте его только там, где сопоставление с образцом слишком дорого (что должно быть только в случае очень длинных строк) или где API ожидает перечисление.
Если вы переключитесь на String.split (String)
, обязательно укажите разделитель в кавычках. Либо вручную ( «\\ |»
), либо автоматически с помощью string.split (Pattern.quote (delim));
вы можете использовать конструктор, который принимает дополнительное логическое значение returnDelims и передает ему значение true. таким образом вы получите разделители, которые позволят вам обнаружить это условие.
в качестве альтернативы вы можете просто реализовать свой собственный токенизатор строк, который сделает то, что вам нужно, это не так сложно.
StringTokenizer игнорирует пустые элементы. Рассмотрите возможность использования String.split, который также доступен в версии 1.4.
Из документации javadocs:
StringTokenizer - это устаревший класс, который сохранен по соображениям совместимости , хотя его использование не рекомендуется в новом коде . Рекомендуется, чтобы любой, желающий получить эту функцию, использовал вместо этого метод разделения String или пакет java.util.regex.