Консольный ввод с использованием объекта 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; просмотров: 2323;