2012-03-18 3 views
1

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

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

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

ответ

2

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

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

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

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

+0

Это не работает (генерирует исключение); Мне не удалось создать экземпляр, в котором используется привязка строки '$' как единственная составляющая шаблона к 'Scanner.next (...)' фактически _does_ работе. Он не будет работать для пустой строки, например: 'new Scanner (" "). Next (" $ ")'. –

2

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

ID: Scannerto read 'all': \\A. Поэтому, если вы хотите оставить остальную часть сканера, вы можете ее изменить:

scanner.useDelimiter("\\A"); 
String content = scanner.hasNext() ? scanner.next() : null; 
+0

'\ A' является _not_ специальным разделителем, чтобы читать« все ». Это якорь регулярных выражений, который обычно ведет себя так же, как '^' (начало записи строки), _unless_ «многострочный режим» был установлен ('Pattern.MULTILINE' в' Pattern.compile (...) '): тогда '^' совпадает с символом новой строки, а '\ A' по-прежнему совпадает с началом строки. В этом свете, что делает ваш код, устанавливается разделитель на якорь с нулевой шириной начала строки, который нигде не будет соответствовать, и поэтому он возвращает остальную часть строки при вызове 'scanner.next()' (обычно 'next()' останавливается перед соответствующим разделителем). Однако это работает. –

Смежные вопросы