Распознавание новой строки Java Scanner

Я не могу найти документацию, в которой указано, как сканер обрабатывает шаблоны новой строки по умолчанию. Я хочу читать файл построчно, чтобы сканер мог обрабатывать окончания строк \r, \n или \r\n независимо от системы, в которой на самом деле работает программа.

Если я объявлю сканер так:

Scanner scanner = new Scanner(reader);

каково поведение по умолчанию? Будет ли он обрабатывать все три типа, как описано выше, или я должен указать это явно?


person Anthony    schedule 07.05.2011    source источник
comment
Попробуйте и посмотрите, что произойдет. Создайте 3 разных файла, каждый из которых использует другую строку EOL.   -  person camickr    schedule 07.05.2011
comment
На самом деле, это тот случай, когда попробуйте и убедитесь, что это не даст вам полного ответа!   -  person Stephen C    schedule 07.05.2011
comment
@Setphen C, задан вопрос, обрабатывает ли он \r, \n или \r\n. Это легко проверяется и проверяется. Да, полный ответ: он также поддерживает символы Юникода, но вопрос был не в этом. Правильным вопросом было бы тестирование сканера, я заметил, что он поддерживает \r, \n \r\n, поддерживает ли он что-нибудь еще? Плакат выбрал ленивый путь и никогда не выучит простые методы решения проблем, если люди будут продолжать кормить с ложечки ответами, которые легко проверить.   -  person camickr    schedule 07.05.2011
comment
@Duracell, Небольшое тестирование показало, что это правда, что вы должны были сделать, прежде чем публиковать вопрос!   -  person camickr    schedule 07.05.2011
comment
@camickr: Как отметил Стивен С., «попробуй и увидишь» не дает полного ответа. Все хорошо и приятно видеть, работает ли это на МОЕЙ машине, но мне нужен был более точный ответ.   -  person Anthony    schedule 07.05.2011
comment
@Duracell, Java должна быть кроссплатформенной, так почему бы ей не работать? Опять же, если вас это беспокоит, вы должны были задать вопрос, я протестировал его на своей машине, и он поддерживает 3 строки EOL, как и ожидалось. Кто-нибудь может подтвердить, будет ли это работать на всех платформах? Смысл в том, чтобы показать, что вы приложили усилия и просите подтверждения, поэтому вы делаете тест до, а не после того, как задали вопрос! Вы также могли бы посмотреть исходный код, как и все остальные. Никто больше не запускал код на всех платформах.   -  person camickr    schedule 07.05.2011
comment
@camrickr - на самом деле... если внимательно прочитать вопрос... он также спросил каково поведение по умолчанию. Как я уже сказал ... попробуйте и убедитесь, что это НЕ полный ответ ... НА ВОПРОС ОП. Кроме того, это плохой ответ/подход в целом. Выполнение кода на разных платформах не сообщило бы вам о наличии еще трех последовательностей завершения строки.   -  person Stephen C    schedule 07.05.2011
comment
Требование OP состояло в том, чтобы поддерживать 3 разные строки EOL, о которых он знал. Это легко проверить. Прочитайте ответ ОП на ответ, который он принял, который был опубликован Дэвидом. Тот факт, что он поддерживает другие строки EOL, может быть положительным или отрицательным в зависимости от требований OP. Я никогда не говорил, что попробуй и увидишь, это полный ответ. Опять же, смысл моего комментария заключался в том, чтобы ОП сам проделал некоторую работу, прежде чем публиковать такой вопрос. Затем вы можете перечислить свои результаты и попросить подтверждения или разъяснения, если что-то не работает, как вы ожидаете.   -  person camickr    schedule 07.05.2011
comment
@camrickr: Насколько я понимаю, camickr, ты не помогаешь этому обсуждению. И вопрос Duracell, и ответ, данный Дэвидом/Стивеном С. действительны. Просто попробовать это не решение, тем более что Scanner четко не определяет, что такое разделитель строк, поэтому он может отличаться в разных реализациях среды выполнения Java.   -  person Maarten Bodewes    schedule 15.06.2011


Ответы (2)


Глядя на исходный код Sun JDK 1.6, используется шаблон "\r\n|[\n\r

…]"

который говорит «\r\n» или любой из \r, \n или символов Юникода для «разделителя строк», «разделителя абзацев» и «следующей строки» соответственно.

person David    schedule 07.05.2011
comment
Спасибо, это то, что мне нужно было знать. Небольшое тестирование показало, что это правда. Если я не укажу разделитель и использую scanner.hasNext, тогда \r, \n и \r\n будут рассматриваться как окончания строк. - person Anthony; 07.05.2011

Это не задокументировано (в Java 1.6), но код JDK использует это регулярное выражение для соответствия разрыву строки:

"\r\n|[\n\r\u2028\u2029\u0085]"

Вот ссылка на исходный код: http://cr.openjdk.java.net/~briangoetz/7012540/webrev/src/share/classes/java/util/Scanner.java.html

ИМО, это должно быть указано, поскольку поведение Scanner по отношению к разделителям строк отличается от (например) BufferedReader. (Я подал отчет об ошибке...)

person Stephen C    schedule 07.05.2011
comment
Это случайно не Стивен Кроули, не так ли? - person Anthony; 07.05.2011
comment
Фу. В настоящее время я прохожу курс разработки программного обеспечения на Java с лектором по имени Стивен С. На секунду я взволнован. - person Anthony; 07.05.2011
comment
Не могли бы вы указать на отчет об ошибке? Я не могу найти его в базе данных ошибок Oracle. Я думаю, что это, безусловно, должно быть в API, поскольку он не использует разделитель строк платформы. - person Maarten Bodewes; 15.06.2011