java.util.Scanner читать оставшееся содержимое

Возможно ли, используя экземпляр java.util.Scanner, вернуть весь оставшийся контент? Мой сценарий таков: как только я прочитал несколько полей в String, я просто хочу получить все, что осталось, и сохранить это где-то еще. Например, мой контент может включать:

1,2,Some Garbage with \' special characters and so on

Я бы построил сканер, используя , в качестве разделителя, дважды вызывал getInt(), а затем хотел бы вернуть "Some Garbage with \' special characters and so on" одним вызовом.


person Joseph Paterson    schedule 18.03.2012    source источник


Ответы (2)


Нет «хорошего» способа сделать это со сканером. Вы можете попробовать String next(Pattern pattern) передать ему многострочный шаблон, например $:

Pattern p = Pattern.compile("$", Pattern.MULTILINE);

Я не пробовал это, но, вероятно, это сработает. Только не забудьте проверить его, когда в вашем вводе останется несколько строк.

НО Я думаю, что лучший способ - просто прочитать из обернутого входного потока, используя обычный метод read(byte[]) в цикле. Это связано с тем, что сканер не участвует в чтении потока как есть. Присутствует чтение отдельных полей. И делает это очень хорошо. В вашем случае вы просто хотите прочитать «blob», поэтому просто прочитайте его, используя поток полезной нагрузки.

person AlexR    schedule 18.03.2012
comment
Это не работает (выдает исключение); Мне не удалось создать экземпляр, в котором использование привязки линии $ в качестве единственного компонента шаблона для Scanner.next(...) действительно действительно работает. Это не сработает для пустой строки, например: new Scanner("").next("$"). - person Stefan van den Akker; 15.01.2018

Как указано в AlexR, лучше читать исходный поток, но в моем случае он потребляется и не может читать.

В Scanner прочитать "все": \\A. Поэтому, если вам нужна остальная часть сканера, вы можете изменить ее:

scanner.useDelimiter("\\A");
String content = scanner.hasNext() ? scanner.next() : null;
person lucasvc    schedule 17.01.2017
comment
\A не является специальным разделителем для чтения "все". Это якорь строки регулярного выражения, который обычно ведет себя так же, как ^ (соответствует началу строки), если не был установлен многострочный режим (Pattern.MULTILINE в Pattern.compile(...)): тогда ^ соответствует после новой строки, а \A по-прежнему соответствует начало строки. В этом свете ваш код устанавливает разделитель на якорь начала строки нулевой ширины, который нигде не будет совпадать, и поэтому он возвращает остальную часть строки при вызове scanner.next() (обычно next() останавливается перед совпадающим разделитель). Однако это действительно работает. - person Stefan van den Akker; 15.01.2018