Ввод и вывод
Для того чтобы немного "оживить" программы, рассматриваемые здесь в качестве примеров, организуем ввод информации и форматирование выводимых данных. Конечно, в современных приложениях для ввода данных используются элементы ГПИ, но для программирования такого интерфейса требуются приемы и инструментальные средства, которые мы пока еще не рассматривали. Наша текущая цель — ознакомить вас с основными языковыми средствами Java, и поэтому мы ограничимся лишь консольным вводом-выводом. А вопросы программирования ГПИ будут подробно рассмотрены в главах 7-9.
Чтение вводимых данных
Как вам должно быть уже известно, информацию можно легко вывести в стандартный поток вывода (т.е. в консольное окно), вызвав метод System, out .println (). А вот организовать чтение из стандартного потока ввода System, in (т.е. с консоли) не так-то просто. Для этого придется создать объект типа Scanner и связать его со стандартным потоком ввода System, in, как показано ниже.
Scanner in = new Scanner(System.in); «
(Конструкторы и операция new подробно рассматриваются в главе 4.)
Сделав это, вы получите в свое распоряжение многочисленные методы из класса Scanner, предназначенные для чтения вводимых данных. Например, метод nextLine () осуществляет чтение вводимой строки, как показано ниже.
System.out.print("What is your name? "); String name = in.nextLine();
В данном случае метод nextLine () был применен, потому что вводимая строка может содержать пробелы. А для того чтобы прочитать одно слово, отделяемое пробелами, можно сделать следующий вызов:
String firstName = in.nextO;
Для чтения целочисленного значения служит метод next Int ():
System.out .print ("How old are you? "); int age = in.nextlnt ();
Как нетрудно догадаться, метод nextDouble () осуществляет чтение очередного числового значения в формате с плавающей точкой.
Программа, код которой представлен в листинге 3.2, запрашивает имя пользователя и его возраст, а затем выводит сообщение наподобие следующего:
Hello, Cay. Next year, you'll be 52 (Здравствуйте, Кей. В следующем году вам будет 52)
В первой строке кода этой программы содержится следующее выражение:
import java.util.*;
Класс Scanner принадлежит пакету java.util. Если вы собираетесь использовать в программе класс, не содержащийся в базовом пакете java.lang, вам придется включить в код своей программы директиву import. Более подробно пакеты и директива import будут рассмотрены в главе 4.
Листинг 3.2. Исходный код из файла InputTest/InputTest. j ava
I import java.util.*; 2
3 /**
4 * Эта программа демонстрирует консольный ввод
5 * (aversion 1.10 2004-02-10
6 * @author Cay Horstmann
7 */
8 public class InputTest
9 {
10 public static void main(String[] args)
II {
12 Scanner in = new Scanner(System.in); 13
14 // получить первую вводимую строку
15 System.out.print("What is your name? ");
16 String name = in.nextLine (); 17
18 // получить вторую вводимую строку
19 System.out.print("How old are you? ");
20 int age = in.nextlnt (); 21
22 // вывести результат на консоль
23 System.out.println(
24 "Hello, " + name + ". Next year, you'll be " + (age + 1) );
25 }
26 }
НА ЗАМЕТКУ! Класс Scanner не подходит для ввода паролей с консоли, поскольку такой ввод будет явно виден всякому. В версии Java SE 6 появился класс Console, специально предназначенный для этой цели. Чтобы организовать ввод пароля с консоли, можно воспользоваться следующим фрагментом кода:
Console cons = System.console();
String username = cons.readLine("User name: ");
char[] passwd = cons.readPassword("Password: ");
Из соображений безопасности пароль возвращается в виде массива символов, а не в виде символьной строки. После обработки пароля следует немедленно перезаписать элементы массива значением заполнителя. (Обработку массивов мы обсудим далее в этой главе.)
Обработка вводимых данных с помощью объекта типа Console не так удобна, как с помощью объекта типа Scanner. Ведь вводимые данные в этом случае можно читать только построчно. В классе Console отсутствуют методы для чтения отдельных слов или чисел.
• Scanner(InputStream in)
Конструирует объект типа Scanner на основе заданного потока ввода.
• String nextLine()
Читает очередную строку.
java.util.Scanner 5.0
• String next()
Читает очередное вводимое слово, отделяемое пробелами.
• int nextlnt()
• double nextDouble()
Читает очередную последовательность символов, представляющую целое число или число с плавающей точкой, выполняя соответствующее преобразование.
• boolean hasNext()
Проверяет, присутствует ли еще одно слово в потоке ввода.
• boolean hasNextlntO
• boolean hasNextDouble()
Проверяют, присутствует ли в потоке ввода последовательность символов, представляющая целое число или число с плавающей точкой.
java. lang. System 1.0
• static Console console()
Возвращает объект типа Console для взаимодействия с пользователем через консольное окно, а
если такое взаимодействие невозможно, — пустое значение null. Объект типа Console доступен в любой программе, запущенной в консольном окне. В противном случае его доступность зависит от конкретной системы.
java.io.Console 6
• static chart] readPassword(String prompt, Object... args)
• static String readLine(String prompt, Object... args)
Отображают приглашение и читают вводимые пользователем данные до тех пор, пока не
получают конец вводимой строки. Параметры args могут быть использованы для предоставления аргументов форматирования, как поясняется в следующем разделе. |