Я пытаюсь прочитать InputStream строковых токенов с помощью сканера. Каждый токен заканчивается запятой ,. Пустая строка "" также является допустимым токеном. В этом случае весь токен - это просто запятая, завершающая его.

InputStream медленно читается из другого процесса, и любые токены следует обрабатывать, как только они будут полностью прочитаны. Поэтому о чтении всего InputStream в String не может быть и речи.

Пример ввода может выглядеть так:

ab,,cde,fg,

Если я установил разделитель Scanner на запятую, он, похоже, отлично справился с задачей.

InputStream input = slowlyArrivingStreamWithValues("ab,,cde,fg,");

Scanner scan = new Scanner(input);
scan.useDelimiter(Pattern.quote(","));
while (scan.hasNext()) {
    System.out.println(scan.next());
}

Выход:

ab

cde
fg

Однако проблемы возникают, когда поток начинается с пустого токена. По какой-то причине Сканер просто игнорирует первый токен, если он пуст.

/* begins with empty token */
InputStream input = slowlyArrivingStreamWithValues(",ab,,cde,fg,");
...

Выход:

ab

cde
fg

Почему сканер игнорирует первый токен? Как я могу это включить?

2
Tuupertunut 2 Янв 2018 в 07:37

2 ответа

Лучший ответ

Попробуйте использовать в качестве шаблона ретроспективный просмотр:

(?<=,)

А затем замените запятую пустой строкой на каждый соответствующий токен. Рассмотрим следующий код:

String input = ",ab,,cde,fg,";
Scanner scan = new Scanner(input);
scan.useDelimiter("(?<=,)");
while (scan.hasNext()) {
    System.out.println(scan.next().replaceAll(",", ""));
}

Это выводит следующее:

(empty line)
ab

cde
fg

Демо

0
Tim Biegeleisen 2 Янв 2018 в 04:59

Будет проще, если вы напишете это сами, без использования Scanner:

static List<String> getValues(String source){
    List<String> list = new ArrayList<String>();
    for(int i = 0; i < source.length();i++){
        String s = "";
        while(source.charAt(i) != ','){
            s+=source.charAt(i++);
            if(i >= source.length()) break;
        }
        list.add(s);
    }
    return list;
}

Например, если source = ",a,,b,,c,d,e", вывод будет "", "a", "", "c", "d", "e".

0
Lorenzo Notaro 2 Янв 2018 в 05:16