Java StringTokenizer.nextToken() пропускает пустые поля
Я использую вкладку (/t) в качестве разделителя, и я знаю, что в моих данных есть несколько пустых полей, например:
one->two->->three
Где → равно вкладке. Как видите, пустое поле по-прежнему правильно окружено вкладками.
Данные собираются с использованием цикла:
while ((strLine = br.readLine()) != null) {
StringTokenizer st = new StringTokenizer(strLine, "\t");
String test = st.nextToken();
...
}
Однако Java игнорирует эту "пустую строку" и пропускает поле.
Есть ли способ обойти это поведение и заставить java читать в пустых полях?
Ответы
Ответ 1
Спасибо вам вообще. Из-за первого комментария я смог найти решение:
Да, вы правы, спасибо за вашу ссылку:
Scanner s = new Scanner(new File("data.txt"));
while (s.hasNextLine()) {
String line = s.nextLine();
String[] items= line.split("\t", -1);
System.out.println(items[5]);
//System.out.println(Arrays.toString(cols));
}
Ответ 2
В базе данных Sun есть RFE в базе данных Sun об этой проблеме StringTokenizer
со статусом Will not fix
.
Оценка этих состояний RFE, я цитирую:
С добавлением пакета java.util.regex
в 1.4.0
, мы имеем в основном устарела необходимость StringTokenizer
. Мы не удалим класс по соображениям совместимости. Но regex
дает вам просто то, что вам нужно.
И затем предлагает использовать метод String#split(String)
.
Ответ 3
Вы можете использовать Apache
Commons StringUtils.splitPreserveAllTokens(). Он делает именно то, что вам нужно.
Ответ 4
Я бы использовал Guava Splitter, который не нуждается во всех машинах большого регулярного выражения, и более корректен, чем String split()
метод:
Iterable<String> parts = Splitter.on('\t').split(string);
Ответ 5
Как вы можете видеть в Java Doc http://docs.oracle.com/javase/6/docs/api/java/util/StringTokenizer.html вы можете использовать конструктор public StringTokenizer(String str, String delim, boolean returnDelims)
с returnDelims
true
Поэтому он возвращает каждый разделитель как отдельную строку!
Edit:
НЕ используйте, так как @npe уже напечатан, StringTokenizer больше не должен использоваться! См. JavaDoc:
StringTokenizer - это унаследованный класс, который сохраняется для совместимости причинам, хотя его использование не рекомендуется в новом коде. Рекомендуется что любой, кто ищет эту функциональность, использует метод split
String
или java.util.regex
.