В этом уроке мы поговорим о формате вывода чисел в Java. Научимся выводить числа с заданной точностью.
Эта статья адресована в первую очередь начинающим Java программистам.
Обычно вывод данных на консоль трудностей не представляет с System.out.print или System.out.println, как правило, справляются все. Но когда же дело доходит до ввода данных возникают трудности.
Виной тому неудобная и сложная для восприятия реализация консольного ввода в Java. Но тем не менее его можно освоить если изучить его работу.
Последняя строится на основе двух классов: InputStream (System.in) и Scanner.
Java получает данные из консоли при помощи системного потока ввода (Isystem.in ) поэтому данный способ ввода может показаться очевидным. Но, к сожалению, он имеет один серьёзный недостаток.
Дело в том, что системный поток ввода получает только числовые коды символов, которые введены в окно консоли и больше ничего. Причём за один раз из него можно прочитать код только одного символа. Поэтому для того чтобы прочитать слово или строку необходимо использовать цикл.
Ниже приведён пример считывания введённой в консоли строки подобным образом.
Java
int inChar; String s = ""; try { inChar = System.in.read(); while (System.in.available() > 0) { s += (char) inChar; inChar = System.in.read(); } } catch (IOException e) { System.out.println("Ошибка"); }
int inChar ; String s = "" ; try { while (System . in . available () > 0 ) { s += (char ) inChar ; inChar = System . in . read () ; } catch (IOException e ) { System . out . println ("Ошибка" ) ; |
Пока в потоке ввода есть данные (метод available возвращает значение больше нуля), мы раз разом считываем код символа, затем преобразуем его в собственно сам символ и добавляем этот символ в конец строки.
На этом неудобства данного подхода не заканчиваются потому, что мы всегда получаем данные в строковом формате. Если же нам требуется ввести, допустим, целое число? Тогда нам придётся дополнить вышеприведённый пример приведением типов с соответствующей проверкой.
Поэтому для получения данных от пользователя в консольных приложениях системный поток ввода на прямую сейчас почти не используется. Вместо него предпочтительнее работать с классом Scanner.
Класс Scanner позволяет избежать всех трудностей, связанных с использованием системного потока ввода и максимально упростить ввод данных от пользователей в консольных приложениях.
Стоит отметить, что чтением данных из консоли возможности класса Scanner не ограничиваются. Но, это уже тема для отдельной статьи.
Экземпляр класса Scanner создаётся при помощи конструктора, который принимает в качестве единственного параметра поток ввода. После этого можно сразу считывать готовые данные при помощи семейства методов с префиксом next.
Вот пример, который демонстрирует считывание введённой в консоли строки. В конструктор передаётся системный поток ввода.
Java
Scanner in = new Scanner(System.in); System.out.print("Введите строку: "); String str = in.nextLine();
Scanner in = new Scanner (System . in ) ; System . out . print ("Введите строку: " ) ; String str = in . nextLine () ; |
Если сравнить этот пример с приведённым ранее прямым считыванием строки из системного потока ввода, то преимущество класса Scanner очевидно. Ведь нам уже не требуется вручную считывать коды символов и формировать строку в цикле. Класс Scanner самостоятельно выполняет все рутинные низкоуровневые функции, предоставляя данные, которые уже готовы к использованию в программе.
Как уже говорилось выше, класс Scanner имеет целый ряд методов для считывания данных, но все они отличаются друг от друга только типами возвращаемых значений и соответствующими им названиями.
Так, помимо метода nextLine, существуют методы nextBoolean, nextByte, nextInt, nextDouble и другие.
Кроме того, имеется ряд методов с префиксом hasNext, которые позволяют определить тип считываемых данных. Например, hasNextLine, hasNextInt, hasNextBollean и т. д. Если в потоке ввода находятся данные соответствующего типа, эти методы возвращают true.
28.05.16. Данный материал посвящен системе ввода - вывода в Java. Система ввода-вывода (input/output, или I/O) информации, реализованные в составе стандартного пакета Java.io. Поддержка ввода-вывода реализован ядром библиотек программного интерфейса (API), а не ключевыми словами языка. Классы библиотек ввода – вывода Java разделены на две части – одни осуществляют ввод, другие вывод. Тем не менее, Java обеспечивает мощную и гибкую поддержку ввода – вывода, когда это касается файлов и сетей.
Потоки
Ввод – вывод в Java осуществляется с помощью так называемых потоков в Java (stream), которая либо порождает, либо принимает информацию. Осуществление ввода – вывода с помощью потоков имеет свои плюсы, потому что поток скрывает все детали низкоуровневых процессов, происходящих с данными непосредственно в устройствах ввода - вывода. Все потоки ведут себя на одинаково, даже несмотря на то, что реальные физические устройства, к которым они подключена, отличаются друг от друга. Таким образом, одни и те же классы и методы ввода – вывода применимы к устройствам разного типа. Это означает, что абстракция входного потока может охватить разные типы ввода: из дискового файла, клавиатуры или сетевого сокета. Аналогично выходной поток может ссылаться на консоль, дисковый файл или сетевое подключение. Потоки – это ясный способ обращения с вводом – выводом без необходимости для вашего кода разбираться с разницей, например между клавиатурой и сетью. Java реализует потоки внутри иерархии классов, определенных в пакете java.io. Java определяет два типа потоков: байтовые и символьные. Байтовые потоки предоставляют удобные средства для управления вводом и выводом байтов. Байтовые потоки используются, например, при чтении и записи бинарных данных. Обычный консольный ввод- вывод идет через байтовые потоки. Символьные потоки предлагают удобные возможности управления вводом и выводом символом. Они используют кодировку Unicode и, таким образом, могут быть интернационализированы. Кроме того, в некоторых случаях символьные потоки более эффективны, чем байтовые.
//Использование BufferedReader для чтения символов с консоли.
//Import java.io.*;
//Class BRRead{
//Public static void main(Straing args) throws IOException
//{
//char c;
//
//System.out.println("Вводите символы, ’q’ – для вывода.”);
//// читать символы
//do{
//c = (char) br.read();
//System.out.println(c);
//}while(c!= ‘q’);
//}
//}
Ниже показан пример запуска этой программы:
Вводите символы, ‘q’ – для вывода.
123abcq
1
2
3
A
B
C
Q
Этот вывод может выглядеть немного не так, как вы ожидали, потому что
System.in Является строчно – буферизованными по умолчанию. Это значит, что никакого ввода действительности программе предается до тех пор, пока будет нажата клавиша (ENTER). Как можно предположить, это делает
read() лишь отчасти применимым для интерактивного консольного.
Последнее обновление: 27.10.2018
Наиболее простой способ ввзаимодействия с пользователем представляет консоль: мы можем выводить на консоль некоторую информацию или, наоборот, считывать с консоли некоторые данные. Для взаимодействия с консолью в Java применяется класс System , а его функциональность собственно обеспечивает консольный ввод и вывод.
Для создания потока вывода в класс System определен объект out . В этом объекте определен метод println , который позволяет вывести на консоль некоторое значение с последующим переводом консоли на следующую строку. Например:
Public class Program { public static void main(String args) { System.out.println("Hello world!"); System.out.println("Bye world..."); } }
В метод println передается любое значение, как правило, строка, которое надо вывести на консоль. И в данном случае мы получим следующий вывод:
Hello world! Bye world...
При необходимости можно и не переводить курсор на следующую строку. В этом случае можно использовать метод System.out.print() , который аналогичен println за тем исключением, что не осуществляет перевода на следующую строку.
Public class Program { public static void main(String args) { System.out.print("Hello world!"); System.out.print("Bye world..."); } }
Консольный вывод данной программы:
Hello world!Bye world...
Но с помощью метода System.out.print также можно осуществить перевод каретки на следующую строку. Для этого надо использовать escape-последовательность \n :
System.out.print("Hello world \n");
Нередко необходимо подставлять в строку какие-нибудь данные. Например, у нас есть два числа, и мы хотим вывести их значения на экран. В этом случае мы можем, например, написать так:
Public class Program { public static void main(String args) { int x=5; int y=6; System.out.println("x=" + x + "; y=" + y); } }
Консольный вывод программы:
Но в Java есть также функция для форматированного вывода, унаследованная от языка С: System.out.printf() . С ее помощью мы можем переписать предыдущий пример следующим образом:
Int x=5; int y=6; System.out.printf("x=%d; y=%d \n", x, y);
В данном случае символы %d обозначают спецификатор, вместо которого подставляет один из аргументов. Спецификаторов и соответствующих им аргументов может быть множество. В данном случае у нас только два аргумента, поэтому вместо первого %d подставляет значение переменной x, а вместо второго - значение переменной y. Сама буква d означает, что данный спецификатор будет использоваться для вывода целочисленных значений.
Кроме спецификатора %d мы можем использовать еще ряд спецификаторов для других типов данных:
%x : для вывода шестнадцатеричных чисел
%f : для вывода чисел с плавающей точкой
%e : для вывода чисел в экспоненциальной форме, например, 1.3e+01
%c : для вывода одиночного символа
%s : для вывода строковых значений
Например:
Public class Program { public static void main(String args) { String name = "Tom"; int age = 30; float height = 1.7f; System.out.printf("Name: %s Age: %d Height: %.2f \n", name, age, height); } }
При выводе чисел с плавающей точкой мы можем указать количество знаков после запятой, для этого используем спецификатор на %.2f , где.2 указывает, что после запятой будет два знака. В итоге мы получим следующий вывод:
Name: Tom Age: 30 Height: 1,70
Для получения ввода с консоли в классе System определен объект in . Однако непосредственно через объект System.in не очень удобно работать, поэтому, как правило, используют класс Scanner , который, в свою очередь использует System.in . Например, напишем маленькую программу, которая осуществляет ввод чисел:
Import java.util.Scanner; public class Program { public static void main(String args) { Scanner in = new Scanner(System.in); System.out.print("Input a number: "); int num = in.nextInt(); System.out.printf("Your number: %d \n", num); in.close(); } }
Так как класс Scanner находится в пакете java.util , то мы вначале его импортируем с помощью инструкции import java.util.Scanner .
Для создания самого объекта Scanner в его конструктор передается объект System.in . После этого мы можем получать вводимые значения. Например, в данном случае вначале выводим приглашение к вводу и затем получаем вводимое число в переменную num.
Чтобы получить введенное число, используется метод in.nextInt(); , который возвращает введенное с клавиатуры целочисленное значение.
Пример работы программы:
Input a number: 5 Your number: 5
Класс Scanner имеет еще ряд методов, которые позволяют получить введенные пользователем значения:
next() : считывает введенную строку до первого пробела
nextLine() : считывает всю введенную строку
nextInt() : считывает введенное число int
nextDouble() : считывает введенное число double
nextBoolean() : считывает значение boolean
nextByte() : считывает введенное число byte
nextFloat() : считывает введенное число float
nextShort() : считывает введенное число short
То есть для ввода значений каждого примитивного типа в классе Scanner определен свой метод.
Например, создадим программу для ввода информации о человеке:
Import java.util.Scanner; public class Program { public static void main(String args) { Scanner in = new Scanner(System.in); System.out.print("Input name: "); String name = in.nextLine(); System.out.print("Input age: "); int age = in.nextInt(); System.out.print("Input height: "); float height = in.nextFloat(); System.out.printf("Name: %s Age: %d Height: %.2f \n", name, age, height); in.close(); } }
Здесь последовательно вводятся данные типов String, int, float и потом все введенные данные вместе выводятся на консоль. Пример работы программы:
Input name: Tom Input age: 34 Input height: 1,7 Name: Tom Age: 34 Height: 1,70
Обратите внимание для ввода значения типа float (то же самое относится к типу double) применяется число "1,7", где разделителем является запятая, а не "1.7", где разделителем является точка. В данном случае все зависит от текущей языковой локализации системы. В моем случае русскоязычная локализация, соответственно вводить необходимо числа, где разделителем является запятая. То же самое касается многих других локализаций, например, немецкой, французской и т.д., где применяется запятая.
Библиотека Swing включает богатый выбор стандартных диалоговых окон, существенно упрощающих и ускоряющих вывод простой информации типа сообщений о работе программы, ошибках и нестандартных ситуациях. Для вывода в графический интерфейс приложения разнообразной информации и выбора простых данных предназначен класс JOptionPane , работа с которым связана с вызовом одного из многочисленных статических методов, создающих и выводящих на экран модальное диалоговое окно стандартного вида. В диалоговых окнах JOptionPane можно выводить самую разнообразную информацию и, при необходимости, размещать в них дополнительные компоненты.
JOptionPane унаследован от базового класса JComponent библиотеки Swing, так что можно работать с ним напрямую, т.е. создавать экземпляры класса JOptionPane и настраивать их свойства. Использование стандартных диалоговых окон существенно упрощает разработку приложения и позволяет ускорить процесс освоения пользователем интерфейса.
Все стандартные диалоговые окна Swing имеют собственные UI-представители, отвечающие за интерфейс окна в используемом приложении. Это особенно важно для внешних видов окон, имитирующих известные платформы, пользователи которых не должны ощущать значительной разницы при переходе от «родных» приложений к Java-приложениям.
Интерфейс экземпляра класса JOptionPane имеет структуру, представленную на следующем рисунке. Иконка в интерфейсе может отсутствовать.
// Простое диалоговое окно с заголовком «Message» public static void showMessageDialog(Component parent, Object message) throws HeadlessException // Диалоговое окно с заголовком и типом сообщения public static void showMessageDialog(Component parent, Object message, String title, int messageType) throws HeadlessException // Диалоговое окно с заголовком, типом сообщения и иконкой public static void showMessageDialog(Component parent, Object message, String title, int messageType, Icon icon) throws HeadlessException
// Простое диалоговое окно подтверждения с кнопками Yes, No, Cancel и // с заголовком «Select an Option» public static void showConfirmDialog(Component parent, Object message) throws HeadlessException // Окно подтверждения с заголовком и кнопками, определенными // опцией optionType public static void showConfirmDialog(Component parent, Object message, String title, int optionType) throws HeadlessException // Окно подтверждения с заголовком, кнопками, определенными // опцией optionType, и иконкой public static void showConfirmDialog(Component parent, Object message, String title, int optionType, Icon icon) throws HeadlessException
// Диалоговое окно с полем ввода public static void showInputDialog(Component parent, Object message) throws HeadlessException // Диалоговое окно с полем ввода, инициализируемое initialSelectionValue public static void showInputDialog(Component parent, Object message, Object initialSelectionValue) throws HeadlessException // Диалоговое окно с полем выбора из списка selectionValues public static void showInputDialog(Component parent, Object message, String title, int messageType, Icon icon, Object selectionValues, Object initialSelectionValue) throws HeadlessException
parent - родительское окно.
message - отображаемый в окне текст сообщения. В большинстве случаев это строка, но может быть использован массив строк String, компонент Component, иконка Icon, представленная меткой JLabel, объект Object, конвертируемый в строку методом toString().
title - заголовок окна.
messageType - тип диалогового окна:
optionType - опция определения кнопок управления:
selectionValues - список возможных значений. В диалоговом окне InputDialog список будет представлен в компоненте JComboBox или JList. Если selectionValues = null, то в окне будет определено поле JTextField, в которое пользователь может ввести любое значение.
initialSelectionValue - инициализируемое значение.
icon - отображаемая в диалоговом окне иконка.
Кнопки управления, как правило, имеют заголовки «Yes», «No», «Cancel». Для локализации кнопок диалогового компонента JOptionPane можно использовать UIManager следующим образом:
UIManager.put("OptionPane.yesButtonText" , "Да"); UIManager.put("OptionPane.noButtonText" , "Нет"); UIManager.put("OptionPane.cancelButtonText", "Отмена"); UIManager.put("OptionPane.okButtonText" , "Готово");
Пример JOptionPaneTest.java включает использование всех типов диалоговых окон JOptionPane . В интерфейсе окна, представленном на следующем скриншоте, размещаются кнопки, по нажатию на которые формируются соответствующие диалоговые окна JOptionPane .
// Пример использования диалоговых окон JOptionPane import javax.swing.*; import java.awt.event.*; public class JOptionPaneTest extends JFrame { private JPanel contents = null; private JButton btnMessage1 = null; private JButton btnMessage2 = null; private JButton btnMessage3 = null; private JButton btnConfirm1 = null; private JButton btnConfirm2 = null; private JButton btnConfirm3 = null; private JButton btnInput1 = null; private JButton btnInput2 = null; private JButton btnInput3 = null; private ImageIcon icon = null; private final String TITLE_message = "Окно сообщения"; private final String TITLE_confirm = "Окно подтверждения"; private String drink = {"Сок", "Минералка", "Лимонад" , "Пиво"}; public JOptionPaneTest() { super("Пример использования JOptionPane"); setDefaultCloseOperation(EXIT_ON_CLOSE); // Локализация кнопок UIManager.put("OptionPane.yesButtonText" , "Да"); UIManager.put("OptionPane.noButtonText" , "Нет"); UIManager.put("OptionPane.cancelButtonText", "Отмена"); contents = new JPanel(); // Иконка для отображения в окне сообщений icon = new ImageIcon("images/warning.png"); // Кнопка формирования окна по 2-м параметрам btnMessage1 = new JButton("MessageDialog 2"); // Кнопка формирования окна по 4-м параметрам btnMessage2 = new JButton("MessageDialog 4"); // Кнопка формирования окна по 5-и параметрам btnMessage3 = new JButton("MessageDialog 5"); // Кнопки вывода сообщений подтверждения btnConfirm1 = new JButton("ConfirmDialog 4+2"); btnConfirm2 = new JButton("ConfirmDialog 5"); btnConfirm3 = new JButton("ConfirmDialog 6"); btnInput1 = new JButton("InputDialog 2+3"); btnInput2 = new JButton("InputDialog 4"); btnInput3 = new JButton("InputDialog 7"); addMessageListeners(); addConfirmListeners(); addInputListeners (); // Размещение кнопок в интерфейсе contents.add(btnMessage1); contents.add(btnMessage2); contents.add(btnMessage3); contents.add(btnConfirm1); contents.add(btnConfirm2); contents.add(btnConfirm3); contents.add(btnInput1); contents.add(btnInput2); contents.add(btnInput3); setContentPane(contents); // Вывод окна на экран setSize(500, 140); setVisible(true); } }
В методах addMessageListeners() , addConfirmListeners() , addInputListeners() определяются слушатели, обрабатывающие нажатие соответствующих кнопок.
Листинг процедуры создания слушателей, формирующие диалоговые окна вывода сообщений.
Private void addMessageListeners() { btnMessage1.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { JOptionPane.showMessageDialog(JOptionPaneTest.this, "
1. Интерфейс окна вывода сообщений по нажатию на кнопку btnMessage1 . Конструктор получает 2 параметра: родитель и текст сообщения. В заголовок подставляется значение «Message». Текст сообщения имеет HTML разметку.
2. Интерфейс окна вывода сообщений по нажатию на кнопку btnMessage2 . Конструктор получает 4 параметра: родитель, текст сообщения в виде массива строк, строку заголовка окна и тип сообщения.
3. Интерфейс окна вывода сообщений по нажатию на кнопку btnMessage2 . Конструктор получает 5 параметров: родитель, текст сообщения, строку заголовка окна, тип сообщения и иконку.
Листинг процедуры создания слушателей, формирующие диалоговые окна подтверждений.
Private void addConfirmListeners() { btnConfirm1.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { // Окно подтверждения c 4-мя параметрами int result = JOptionPane.showConfirmDialog(JOptionPaneTest.this, "Вам это нужно?", TITLE_confirm, JOptionPane.YES_NO_CANCEL_OPTION); // Окна подтверждения c 2-мя параметрами if (result == JOptionPane.YES_OPTION) JOptionPane.showConfirmDialog(JOptionPaneTest.this, "Вы не отказываетесь?"); else if (result == JOptionPane.NO_OPTION) JOptionPane.showConfirmDialog(JOptionPaneTest.this, "Вы отказались?"); } }); btnConfirm2.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { JOptionPane.showConfirmDialog(JOptionPaneTest.this, "Вы не отказываетесь?", TITLE_confirm, JOptionPane.YES_NO_OPTION, JOptionPane.WARNING_MESSAGE); }}); btnConfirm3.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { JOptionPane.showConfirmDialog(JOptionPaneTest.this, "Вам нравится значок?", TITLE_confirm, JOptionPane.YES_NO_OPTION, JOptionPane.ERROR_MESSAGE, icon); }}); }
1. Интерфейс окна подтверждения по нажатию на кнопку btnConfirm1 . Конструктор получает 4 параметра: родитель, текст сообщения, строка заголовка и опция кнопок управления
В зависимости от нажатой кнопки открываются следующее окно подтверждение (одно из окон на следующем скриншот), конструктор которого получает 2 параметра. Текст заголовка имеет значение по умолчанию «Select an Option».
2. Интерфейс окна подтверждения по нажатию на кнопку btnConfirm2 . Конструктор получает 5 параметров: родитель, текст сообщения, строка заголовка, опция кнопок управления и тип сообщения.
3. Интерфейс окна подтверждения по нажатию на кнопку btnConfirm3 . Конструктор получает 6 параметров: родитель, текст сообщения, строка заголовка, опция кнопок управления, тип сообщения и иконка.
Листинг процедуры создания слушателей, формирующие диалоговые окна выбора
Private void addInputListeners() { btnInput1.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { // Диалоговое окно ввода данных: родитель, HTML сообщение String result = JOptionPane.showInputDialog(JOptionPaneTest.this, "
1. Интерфейс окна ввода данных по нажатию на кнопку btnInput1 представлен на скриншоте слева. Конструктор получает 2 параметра: родитель и текст сообщения с разметкой HTML. После ввода значения и нажатия на одну из клавиш открывается окно, представленное на скриншоте справа.
2. На следующем скриншоте представлен интерфейс окна ввода данных, создаваемое конструктором, которому в качестве текста передается родитель, текстовое сообщение в виде массива строк, строка заголовка и тип диалогового окна (иконки).
3. Интерфейс окна ввода данных по нажатию на кнопку btnInput3 представлен на следующем скриншоте слева. Конструктор получает все возможные параметры: родитель, текстовое сообщение, строка заголовка, тип диалогового окна, иконка, массив строк и выделенное значение по умолчанию. В диалоговом окне возможные значения представлены в компоненте выпадающего списка. После выбора значения и нажатия на одну из клавиш открывается окно вывода сообщения, представленное на скриншоте справа.
Исходные коды примеров, рассмотренных на странице, можно (2.25 Кб).
challenge-sp.ru - Программы. Windows. Устройства. Настройка. Браузеры