Подтвердить что ты не робот

Java StringTokenizer.nextToken() пропускает пустые поля

Я использую вкладку (/t) в качестве разделителя, и я знаю, что в моих данных есть несколько пустых полей, например:

one->two->->three

Где → равно вкладке. Как видите, пустое поле по-прежнему правильно окружено вкладками. Данные собираются с использованием цикла:

 while ((strLine = br.readLine()) != null) {
    StringTokenizer st = new StringTokenizer(strLine, "\t");
    String test = st.nextToken();
    ...
    }

Однако Java игнорирует эту "пустую строку" и пропускает поле.

Есть ли способ обойти это поведение и заставить java читать в пустых полях?

4b9b3361

Ответ 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).

Ответ 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.