Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Различие Scanner, Console и BufferedReader(new In 
:(
    Опции темы
turtles
Дата 12.4.2011, 07:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 49
Регистрация: 17.2.2011

Репутация: нет
Всего: нет



Объясните В чем различие для ввода данных в консоли Scanner, Console и  BufferedReader bReader = new BufferedReader (new InputStreamReader(System.in)); и Какой лучше из них использовать!!!
PM MAIL   Вверх
Stolzen
Дата 12.4.2011, 09:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1041
Регистрация: 17.10.2005

Репутация: 23
Всего: 48



Scanner работает медленнее всех, но самый удобный - сразу позволяет получать следущий токен. Для полученния более-менее похожей функциональности при большей скорости можно использовать класс StreamTokenizer.
Удобно использовать почти всегда.

BufferedReader - просто поток с буффером, т.е. данные загружаются в ОЗУ в некоторый буффер и запрашиваются оттуда, без постоянных обращений к источнику потока.
Можно использовать, когда из файла постоянно данные будут считываться по строкам. Если в строке есть несколько токенов, то каждый из них придется вычленять вручную с помощью String.split или StringTokenizer.

Консоль не использовал, вроде бы это просто обертка над System.in и System.out. Но точно не уверен.

Это сообщение отредактировал(а) Stolzen - 12.4.2011, 09:28


--------------------
datatalks.ru - анализ данных, статистика, машинное обучение
PM MAIL WWW   Вверх
LSD
Дата 12.4.2011, 13:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Console это интерфейс для работы с консолью, это не обертка над stdin/stdout. У него есть пара уникальных особенностей, типа возможности вводя паролей и правильной работы с кодировками консоли. Плюс Console недоступна если приложение запущено без консоли.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
aleksandy
Дата 18.4.2011, 10:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 260
Регистрация: 17.12.2006

Репутация: 4
Всего: 5



Цитата(Stolzen @  12.4.2011,  09:26 Найти цитируемый пост)
Scanner работает медленнее всех, но самый удобный 

Про удобство это, надеюсь, шутка?
Код
public static void main(String[] args) throws Exception {
    Scanner sc = new Scanner(System.in);
    String s = null;
    do {
        System.out.print("String: ");
        sc.nextLine();

        System.out.print("Long: ");
        sc.nextLong();

        System.out.print("Integer: ");
        sc.nextInt();
        System.out.print("again? (y/n): ");
        s = sc.nextLine();
    } while (!s.isEmpty() && s.substring(0, 1).equalsIgnoreCase("y"));
}

Когда завершится программа?
PM   Вверх
Stolzen
Дата 18.4.2011, 10:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1041
Регистрация: 17.10.2005

Репутация: 23
Всего: 48



Цитата(aleksandy @  18.4.2011,  11:30 Найти цитируемый пост)
Про удобство это, надеюсь, шутка?

Нет, вполне не шутка

Код

        Scanner sc = new Scanner(System.in);
        String s = null;
        
        do {
            System.out.format("String: %s %n", sc.next());
            System.out.format("Long: %d %n", sc.nextLong());
            System.out.format("Integer: %d %n", sc.nextInt());
            
            System.out.println("again? (y/n): ");
            
        } while (sc.next().equalsIgnoreCase("y"));


Впрочем, на вкус и цвет фломастеры разные


--------------------
datatalks.ru - анализ данных, статистика, машинное обучение
PM MAIL WWW   Вверх
aleksandy
Дата 19.4.2011, 10:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 260
Регистрация: 17.12.2006

Репутация: 4
Всего: 5



1. Все-таки приведенный тобой алгоритм немного не так работает, как мой: метки выводятся вместе с введенными данными, а не перед тем, т.е. в консоли вместо 
Код
String: sometext
 имеем 
Код
sometext
String: sometext

2. Я не зря использовал именно nextLine(), т.к. иначе получаем исключение 
Код
String: asdfasdf asdf
Long: Exception in thread "main" java.util.InputMismatchException
    at java.util.Scanner.throwFor(Scanner.java:840)
    at java.util.Scanner.next(Scanner.java:1461)
    at java.util.Scanner.nextLong(Scanner.java:2196)
    at java.util.Scanner.nextLong(Scanner.java:2156)
    at Runner.main32(Runner.java:151)
    at Runner.main(Runner.java:140)


3. Вот такой код 
Код
Scanner sc = new Scanner(System.in);
do {
    System.out.print("String: ");
    sc.nextLine();
    System.out.print("Long: ");
    sc.nextLong();
    System.out.format("Integer: ");
    sc.nextInt();
    System.out.print("again? (y/n): ");
} while (sc.next().equalsIgnoreCase("y"));
 дает такой вывод 
Код
String: asdfkjh alsdkfjh laksdfj alskdfj
Long: 1234567
Integer: 123
again? (y/n): y
String: Long: 

Неожиданно, правда? 

Про Scanner#useDelimeter(String) и как с его помощью можно исправить описанное мною поведение я в курсе. Но, как говорится, факт налицо.

Добавлено через 3 минуты и 47 секунд
Я ни в коем случае не хочу сказать, что Scanner - это плохо. Я просто никак не могу понять почему, если он так коряво работает с консолью, во многх примерах его используют именно для нее. Вот пропарсить файл с его помощью - это да, его можно сделать быстро. А вот с консолью лучше работать через Console или BufferedReader.
PM   Вверх
priam220
Дата 29.8.2011, 10:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 291
Регистрация: 4.6.2010

Репутация: 7
Всего: 8



aleksandy,  интересный пример, а с чем связано такое странное поведение?..
PM MAIL   Вверх
aleksandy
Дата 31.8.2011, 10:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 260
Регистрация: 17.12.2006

Репутация: 4
Всего: 5



Насколько я помню это из-за того, что в винде разделителями являются \r\n.
PM   Вверх
LSD
Дата 31.8.2011, 10:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Не вижу ничего удивительного. sc.next() читает "y", и остается пустая строка. Пустая строка тоже подходит под шаблон строки.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
aleksandy
Дата 1.9.2011, 09:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 260
Регистрация: 17.12.2006

Репутация: 4
Всего: 5



Цитата(LSD @  31.8.2011,  10:59 Найти цитируемый пост)
Не вижу ничего удивительного... Пустая строка тоже подходит под шаблон строки

Подходить-то подходит, но, по-моему, было бы логичней сделать разделителем именно System.getProperty("line.separator"), потому как столкнувшись с этой ситуацией я, честно говоря, был озадачен. Чтение исходников, как всегда, помогло разобраться в проблеме и найти пути её решения, но неприятный осадок остался.

PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0507 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.