Ввод и вывод

From AsIsWiki
Revision as of 10:03, 4 April 2015 by Alex (Talk | contribs)

(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to: navigation, search
Форум

Назад | Оглавление | Дальше


Contents

Чтение входных данных

Для чтения информации с консоли, необходимо создать объект Scanner и связать его со стандартным входным потоком System.in:

Scanner in = Scanner(System.in);

Метод nextLine() обеспечивает прием строки текста:

System.out.print("Как вас зовут? ");

String name = in.nextLine();

Метод next() читает одно слово, ориентируясь на пробелы:

System.out.print("Сколько вам лет? ");

int n = in.nextInt();

Метод nextDouble() читает вещественные числа.

Следующий код запрашивает имя, возраст, а затем выводит на консоль сообщение.

import java.util.*;

public class InputTest {

    public static void main(String[] args) {

        Scanner in = new Scanner(System.in);
    
        // Получение первой строки входных данных
        System.out.print("Как вас зовут? ");
        String name = in.nextLine();
    
        // Получение целочисленного значения
        System.out.print("Сколько вам лет? ");
        String n = in.nextInt();
    
        // Вывод информации на консоль
        System.out.println(name + ", в следующем году вам будет " + (n + 1));
    }
}

Класс Scanner принадлежит пакету java.util package. Если в программе требуется класс, не содержащийся в базовом пакете java.lang, то надо добавить в код директиву import.

Слеующй код выполнит аналогичную работу, но без использования средств JDK 5.0

import javax.swing.*;

public class InputTest {

    public static void main(String[] args) {

        String name = JOptionPane.showInputDialog("Как вас зовут? ");
        String input = JOptionPane.showInputDialog("Сколько вам лет? ");

        int n = Integer.parseInt(input);  // преобразует строку в число

        System.out.println(name + ", в следующем году вам будет " + (n + 1));
        System.exit(0);
    }
}

Класс JOptionPane принадлежит пакету javax.swing, поэтому в состав кода добавлен импорт этого пакета.

Если программа вызывает метод JOptionPane.showInputDialog(), то ее надо завершить вызовом System.exit(0). При создании диалогового окна формируется новый управляющий поток. Когда выполнение метода main() оканчивается, автоматического завершения потока не происходит. Чтобы прекратить работу всех потоков, надо вызвать метод System.exit().


Форматирование выходных данных

Неформатированные числа выводятся на экран с максимальным количеством значащих цифр, допустимых для данного типа:

double x = 10000.0 / 3.0;

System.out.print(x);  // результат: 3333.3333333333335

Если выводить на экран сумму в долларах и центах, то большое количество цифр затруднит восприятие.

Метод printf() позволяет отформатировать результат, и привести его к нужному виду:

double x = 10000.0 / 3.0;

System.out.printf("%8.2f", x);  // результат: 3333.33

Формат "%8.2f" означает: 8 - ширина поля вывода, 2 - размер дробной части

Метод printf() позволяет задавать произвольное число параметров, например:

System.out.printf("%s, в следующем году вам будет %d", name, n + 1);

Каждый спецификатор формата, начинающийся с символа %, заменяется соответствующим параметром. Символ преобразования, которым завершается спецификатор формата, задает тип форматируемого значения:

Символ преобразования Тип Пример
d Десятичное целое 159
x Шестнадцатеричное целое 9f
o Восьмеричное целое 237
f Число с фиксированной или плавающей точкой 15.9
e Число с плавающей точкой в экспоненциальной форме 1.59e+01
g Число с плавающей точкой в общем формате (чаще используется формат e или f, в зависимости от того, какой из них дает более короткую запись)
a Шестнадцатеричное число с плавающей точкой 0x1.fccdp3
s Строка Hello
c Символ H
b Логическое значение true
h Хэш-код 42628b2
tx Дата и время См. далее
% Символ процента %
n Разделитель строк, зависящий от платформы

Преобразование s можно использовать для форматирования любого объекта. Если объект реализует интерфейс Formattable, вызывается метод formatTo(). Иначе, для преобразования объекта в строку применяется метод toString().

В составе спецификатора формата могут быть флаги, управляющие форматом выходных данных. Например, запятая формирует разделитель группы:

System.out.printf("%,.2f", 10000.0 / 3.0);  // результат: 3,333.33

В одном спецификаторе формата можно использовать несколько флагов:

"%,(.2f"  // разделители групп + отрицательные числа в скобках

Флаги для метода printf():

Флаг Назначение Пример
+ Выводит знак не только для отрицательных, но и для положительных чисел +3333.33
пробел Добавляет пробел перед положительными числами _3333.33
0 Выводит ведущие нули 003333.33
- Выравнивает поле по левому краю 3333.33__
( Помещает отрицательные числа в скобки (3333.33)
, Задает использование разделителя группы 3,333.33
# для формата f Всегда отображает десятичную точку 3,333.
# для формата x или o Добавляет префикс 0x или 0 0xcafe
^ Задает преобразование в верхний регистр 0XCAFE
$ Определяет индекс параметра, предназначенного для форматирования. Например, выражение %1$d %1$x указывает, что первый параметр должен быть выведен в десятичной форме, далее он же представлен в шестнадцатеричном виде 159 9F
< Аналогичен флагу $. Например, выражение %d %<x указывает, что значение должно быть представлено как в десятичной, так и в шестнадцатеричной форме 159 9F

Для создания форматированной строки, без ее вывода, можно использовать статический метод String.format():

String msg = String.format("%s, в следующем году вам будет %d", name, n + 1);

Пример форматирования даты и времени:

System.out.printf("%tc", new Date());

Результат:

Mon Sep 25 18:27:10 PST 2008

Символы форматирования даты и времени:

Символ преобразования Выходная информация Пример
c Полные сведения о дате и времени Mon Sep 25 21:07:19 PST 2008
F Дата в формате ISO 8601 2008-09-25
D Дата в формате, принятом в США (месяц/день/год) 02/09/2004
T Время при 24-часовом цикле 21:07:19
r Время при 12-часовом цикле 09:07:19 pm
R Время при 24-часовом цикле (без секунд) 21:07
Y Год, представленный четырьмя цифрами (при необходимости отображаются ведущие нули) 2008
y Последние две цифры года (при необходимости отображаются ведущие нули) 08
C Первые две цифры года (при необходимости отображаются ведущие нули) 20
B Полное название месяца September
b или h Сокращенное название месяца Feb
m Месяц, представленный двумя цифрами (при необходимости отображаются ведущие нули) 02
d День, представленный двумя цифрами (при необходимости отображаются ведущие нули) 09
e День, представленный одной или двумя цифрами (ведущие нули не отображаются) 9
A Полное название дня недели Monday
a Сокращенное название дня недели Mon
j День в году, представленный тремя цифрами (при необходимости отображаются ведущие нули); номер дня может лежать в пределах от 001 до 366 069
H Номер часа, представленный двумя цифрами (при необходимости отображаются ведущие нули); номер часа может лежать в пределах от 00 до 23 18
k Номер часа, представленный одной или двумя цифрами (ведущие нули не отображаются); номер часа может лежать в пределах от 0 до 23 18
I Номер часа, представленный двумя цифрами (при необходимости отображаются ведущие нули); номер часа может лежать в пределах от 01 до 12 06
l Номер часа, представленный одной или двумя цифрами (ведущие нули не отображаются); номер часа может лежать в пределах от 1 до 12 6
M Число минут, представленное двумя цифрами (при необходимости отображаются ведущие нули) 05
S Число секунд, представленное двумя цифрами (при необходимости отображаются ведущие нули) 19
L Число милисекунд, представленное двумя цифрами (при необходимости отображаются ведущие нули) 047
N Число наносекунд, представленное девятью цифрами (при необходимости отображаются ведущие нули) 047000000
P AM и PM отображаются символами верхнего регистра PM
p AM и PM отображаются символами нижнего регистра pm
z Смещение относительно гринвического времени (GMT) согласно RFC 822 -0800
Z Временной пояс PST
s Число секунд с 1970-01-01 00:00:00 GMT 1078884319
E Число миллисекунд с 1970-01-01 00:00:00 GMT 1078884319047

Некоторые форматы предполагают отображение лишь отдельных компонентов даты - дня или месяца. Было бы неразумно многократно задавать дату лишь для того, чтобы отформатировать различные ее элементы. По этой причине, в строке, определяющей формат, может задаваться индекс форматируемого параметра. Индекс должен следовать за символом % и завершаться знаком $:

System.out.printf("%1$s %2$tB %2$te, %2$tY", "Дата:", new Date());

Результат:

Дата: September 25, 2008

Также можно использовать флаг <, который означает, что форматированию подлежит тот же параметр, который был сформатирован последним:

System.out.printf("%s %tb %<te, %<tY", "Дата:", new Date());

Результат:

Дата: September 25, 2008

Чтобы избежать конфликтов с флагом 0, индексы начинаются с единицы.

Правила записи спецификатора формата:

Sp printf.png


Ранне, вместо метода printf() использовались классы NumberFormat и DateFormat


Справочник

java.util.Scanner

Scanner(InputStream in)  // создает объект Scanner 
                         // на базе заданного входного потока

String nextLine()        // читает очередную строку

String next()            // читает очередное слово, ориентируясь на пробелы

int nextInt()            // читает очередное целое число

double nextDouble()      // читает очередное вещественное число

boolean hasNext()        // проверяет, существует ли во входном потоке 
                         // еще одно слово

boolean hasNextInt()     // проверяет наличие целого числа во входном потоке

boolean hasNextDouble()  // проверяет наличие вещественного числа 
                         // во входном потоке

javax.swing.JOptionPane

static String showInputDialog(Object message)

Выводит на экран диалоговое окно с сообщением, 
полем ввода и кнопками OK и Cancel.
Метод возвращает строку, введенную пользователем.

java.lang.System

static void exit(int status)

Прекращает работу виртуальной машины 
и передает операционной системе код завершения.
По умолчанию, ненулевой код завершения соответствует возникновению ошибки.

java.lang

Integer.parseInt(String str)

Double.parseDouble(String str)

Преобразует строку в целое или вещественное число.



Форум

Назад | Оглавление | Дальше

Personal tools
Namespaces

Variants
Actions
Navigation
Tools