Консольный ввод с использованием объекта System.in


Консольный ввод в Java реализуется посредством считывания объекта System.in. При этом используется класс BufferedReader — класс буферизованного входного потока. Применение этого класса требует подключения (импорта) пакета java.io (командой import java.io.* в заголовке файла программы). Класс BufferedReader имеет конструктор с аргументом — объектом подкласса класса Reader. В свою очередь, класс Reader — абстрактный класс, подклассом которого является класс InputSrtreamReader. Класс InputSrtreamReader предназначен для преобразования файлов в символы. Аргументом конструктора InputSrtreamReader указывается объект класса InputStream. Напомним, что к этому классу относится и объект System.in.

Далее приведен классический пример команды создания объекта буферизованного символьного потока ввода (объекта br): BufferedReader br=new BufferedReader(new InputStreamReader(System.in)); Объект создается как относящийся к классу BufferedReader. При этом конструктору класса BufferedReader указан анонимный объект класса InputStreamReader. Этот анонимный объект создается конструктором с аргументом — объектом System.in.

Такая нетривиальная цепочка инструкций связана с тем, что класс InputStreamReader переводит байты в символы, но позволяет считывать при этом только один символ. Поэтому объект класса InputStreamReader «вкладывается» в класс BufferedReader, который позволяет считывать несколько символов. Технически это сводится к тому, что символы заносятся в буфер, откуда и считываются (отсюда название — буферизованный поток). Для считывания символов служит метод read() класса BufferedReader. Метод имеет следующую сигнатуру:

int read() throws IOException

Таким образом, метод выбрасывает исключение IOException (ошибка ввода-вывода). Обращаем внимание на то, что в качестве результата метод возвращает число — код символа. Поэтому считанные с помощью этого метода значения необходимо через механизм явного приведения типов преобразовывать в тип char.

Для считывания текстовых строк используют метод readLine() класса BufferedReader. У метода следующая сигнатура: String read() throws IOException. Методом также выбрасывается исключение IOException, а результатом является считанная из буфера текстовая строка. В листинге 1 приведен пример организации консольного ввода.

Листинг 1.Консольный ввод символов

// Подключение пакета:

import java.io.*;

class MySymbInput{

public static void main(String args[]) throws IOException{

// Символьная переменная для записи считываемого значения:

char symb;

// Буферизованный поток ввода:

BufferedReader br=new BufferedReader(new InputStreamReader(System.in));

// Вывод начального сообщения на экран:

System.out.println("Введите несколько символов и нажмите <Enter>:");

do{

// Считывание символа (с явным преобразованием типа):

symb=(char)br.read();

// Вывод считанного символа на экран:

System.out.println("Вы ввели: "+symb);

}while(symb!='Ы');

}}

Первой инструкцией import java.io.* подключается пакет java.io, в котором размещены классы ввода-вывода. Главный метод программы в классе MySymbInput объявлен как выбрасывающий исключение IOException. Это исключение выбрасывается использованным в методе main() методом read() и в классе main() оно не обрабатывается. Поэтому в сигнатуре метода main() есть инструкция throws IOException.

В методе mian() объявляется переменная symb типа char, в которую планируется записывать считываемые символьные значения. Объект br буферизованного символьного потока создается уже знакомой нам (см. ранее) командой:

BufferedReader br= new BufferedReader(new InputStreamReader(System.in))

Далее выводится сообщение с приглашением ввести несколько символов с клавиатуры и запускается цикл do-while. Тело этого цикла состоит из двух команд.

Первой командой symb=(char)br.read() с клавиатуры считывается символ и записывается в переменную symb. Для считывания служит метод read(), вызываемый из объекта буферизованного потока br. Поскольку методом возвращается код символа, для преобразования этого кода в символ используем явное приведение типов — перед инструкцией считывания значения указываем в круглых скобках тип приведения — (char).

Второй командой System.out.println("Вы ввели: "+symb) считанный символ выводится на экран. Цикл выполняется до тех пор, пока не будет считана буква Ы.

Далее приведен результат выполнения программы, если с клавиатуры пользователем вводится фраза «Операция Ы и другие приключения Шурика» с последующим нажатием клавиши Enter:

 

Введите несколько символов и нажмите Enter:

Операция Ы и другие приключения Шурика

Вы ввели: О

Вы ввели: п

Вы ввели: е

Вы ввели: р

Вы ввели: а

Вы ввели: ц

Вы ввели: и

Вы ввели: я

Вы ввели:

Вы ввели: Ы

 

Фактически, на экран посимвольно выводится введенный пользователем текст (по одному символу в строке) до буквы Ы включительно. Обращаем внимание, что если во веденной строке буквы Ы нет, программа продолжит работу даже после нажатия клавиши Enter. При этом нажатие клавиши Enter воспринимается системой как ввод символа с кодом 10.

Пример консольного считывания текстовых строк приведен в листинге 2.

Листинг 2.Консольный ввод текстовых строк

import java.io.*;

class MyStringInput{

public static void main(String args[]) throws IOException{

String str="Ваш заказ: ";

String s;

int count=0;

BufferedReader br=new BufferedReader(new InputStreamReader(System.in));

System.out.println("Что-то желаете?");

s=br.readLine();

while(!s.equalsIgnoreCase("Нет")){

count++;

str=str+"\n"+count+": "+s.toLowerCase();

System.out.println(str+"\n Еще что-то?");

s=br.readLine();}

System.out.println("Спасибо! Ваш заказ принят!");

}}

Программой моделируется процесс приема заказа от клиента в кафе. Начальная «приветственная» фраза выводится командой:

System.out.println("Что-то желаете?")

В ответ пользователь может ввести наименование заказа или слово Нет. Командой s=br.readLine() введенный пользователем текст считывается и заносится в качестве значения в переменную s класса String. При этом используется объект br буферизованного символьного потока ввода. Создается он, как и в предыдущем примере, командой

BufferedReader br=new BufferedReader(new InputStreamReader(System.in))

В инструкции while проверяется условие !s.equalsIgnoreCase("Нет"). Если пользователем введена фраза, отличная от Нет (без учета регистра букв), значение переменной count, которая нумерует позиции заказа, увеличивается на единицу и к строке str добавляется новый пункт заказа. В частности, командой str=str+"\ n"+count+": "+s.toLowerCase() к уже существующему текстовому значению str добавляется символ-инструкция перехода к новой строке, номер заказа, а также сам заказ. Причем заказ записывается в нижнем регистре символов (строчными буквами), для чего из объекта s вызывается метод toLowerCase(). После этого командой System.out.println(str+"\n Еще что-то?") выводится очередной запрос и командой s=br.readLine() считывается ввод пользователя. Так продолжается до тех пор, пока пользователь не введет слово Нет. В конце выполнения программы выводится фраза:

"Спасибо! Ваш заказ принят!"

Результат выполнения программы может иметь следующий вид (жирным шрифтом выделен ввод пользователя):

 

Что-то желаете?

Мороженое

Ваш заказ:

1: мороженое

Еще что-то?

Лимонад

Ваш заказ:

1: мороженое

2: лимонад

Еще что-то?

Булочка

Ваш заказ:

1: мороженое

2: лимонад

3: булочка

Еще что-то?

Кофе со сливками

Ваш заказ:

1: мороженое

2: лимонад

3: булочка

4: кофе со сливками

Еще что-то?

Нет

Спасибо! Ваш заказ принят!

 

Как и в предыдущих случаях, для работы с классами ввода-вывода необходимо подключить пакет java.io.

 



Дата добавления: 2016-06-22; просмотров: 2313;


Поиск по сайту:

Воспользовавшись поиском можно найти нужную информацию на сайте.

Поделитесь с друзьями:

Считаете данную информацию полезной, тогда расскажите друзьям в соц. сетях.
Poznayka.org - Познайка.Орг - 2016-2024 год. Материал предоставляется для ознакомительных и учебных целей.
Генерация страницы за: 0.015 сек.