Потоки ввода/вывода и строки в Java
Для ввода данных используется класс Scanner из библиотеки пакетов Java. Этот класс надо импортировать в той программе, где он будет использоваться. Это делается до начала открытого класса в коде программы. В классе есть методы для чтения очередного символа заданного типа со стандартного потока ввода, а также для проверки существования такого символа. Для работы с потоком ввода необходимо создать объект класса Scanner, при создании указав, с каким потоком ввода он будет связан. Стандартный поток ввода (клавиатура) в Java представлен объектом — System.in . А стандартный поток вывода (дисплей) — уже знакомым вам объектом System.out . Есть ещё стандартный поток для вывода ошибок — System.err , но работа с ним выходит за рамки нашего курса.
import java.util.Scanner; // импортируем класс public class Main < public static void main(String[] args) < Scanner sc = new Scanner(System.in); // создаём объект класса Scanner int i = 2; System.out.print("Введите целое число: "); if(sc.hasNextInt()) < // возвращает истину если с потока ввода можно считать целое число i = sc.nextInt(); // считывает целое число с потока ввода и сохраняем в переменную System.out.println(i*2); >else < System.out.println("Вы ввели не целое число"); >> >
Метод hasNextDouble() , применённый объекту класса Scanner , проверяет, можно ли считать с потока ввода вещественное число типа double , а метод nextDouble() — считывает его. Если попытаться считать значение без предварительной проверки, то во время исполнения программы можно получить ошибку (отладчик заранее такую ошибку не обнаружит). Например, попробуйте в представленной далее программе ввести какое-то вещественное число:
import java.util.Scanner; public class Main < public static void main(String[] args) < Scanner sc = new Scanner(System.in); double i = sc.nextDouble(); // если ввести букву s, то случится ошибка во время исполнения System.out.println(i/3); >>
Имеется также метод nextLine() , позволяющий считывать целую последовательность символов, т.е. строку, а, значит, полученное через этот метод значение нужно сохранять в объекте класса String . В следующем примере создаётся два таких объекта, потом в них поочерёдно записывается ввод пользователя, а далее на экран выводится одна строка, полученная объединением введённых последовательностей символов.
import java.util.Scanner; public class Main < public static void main(String[] args) < Scanner sc = new Scanner(System.in); String s1, s2; s1 = sc.nextLine(); s2 = sc.nextLine(); System.out.println(s1 + s2); >>
- int length() — возвращает длину строки (количество символов в ней);
- boolean isEmpty() — проверяет, пустая ли строка;
- String replace(a, b) — возвращает строку, где символ a (литерал или переменная типа char) заменён на символ b;
- String toLowerCase() — возвращает строку, где все символы исходной строки преобразованы к строчным;
- String toUpperCase() — возвращает строку, где все символы исходной строки преобразованы к прописным;
- boolean equals(s) — возвращает истинну, если строка к которой применён метод, совпадает со строкой s указанной в аргументе метода (с помощью оператора == строки сравнивать нельзя, как и любые другие объекты);
- int indexOf(ch) — возвращает индекс символа ch в строке (индекс это порядковый номер символа, но нумероваться символы начинают с нуля). Если символ совсем не будет найден, то возвратит -1. Если символ встречается в строке нескольо раз, то вовзвратит индекс его первого вхождения.
- int lastIndexOf(ch) — аналогичен предыдущему методу, но возвращает индекс последнего вхождения, если смивол встретился в строке несколько раз.
- int indexOf(ch,n) — возвращает индекс символа ch в строке, но начинает проверку с индекса n (индекс это порядковый номер символа, но нумероваться символы начинают с нуля).
- char charAt(n) — возвращает код символа, находящегося в строке под индексом n (индекс это порядковый номер символа, но нумероваться символы начинают с нуля).
Пример программы, которая выведет на экран индексы всех пробелов в строке, введенноё пользователем с клавиатуры:
import java.util.Scanner; public class Main < public static void main(String[] args) < Scanner sc = new Scanner(System.in); String s = sc.nextLine(); for(int i=0; i < s.length(); i++) < if(s.charAt(i) == ' ') < System.out.println(i); >> > >
Стандартный входной поток java
Приложению Java доступны три стандратных потока, которые всегда открыты: стандартный поток ввода, стандартный поток вывода и стандартный поток вывода сообщений об ошибках.
Все перечисленные выше потоки определены в классе System как статические поля с именами, соответственно, in, out и err:
public static PrintStream err;public static InputStream in;public static PrintStream out;
Заметим, что стандратные потоки, как правило, не используются аплетами, так как браузеры общаются с пользователем через окно аплета и извещения от мыши и клавиатуры, а не через консоль.
Стандартный поток ввода
Стандартный поток ввода in определен как статический объект класса InputStream, который содержит только простейшие методы для ввода данных. Нужнее всего вам будет метод read:
Этот метод читает данные из потока в массив, ссылка на который передается через единственный параметр. Количество считанных данных определяется размером массива, то есть значением b.length.
Метод read возвращает количество прочитанных байт данных или -1, если достигнут конец потока. При возникновении ошибок создается исключение IOException, обработку которого необходимо предусмотреть.
Стандартный поток вывода
Стандартный поток вывода out создан на базе класса PrintStream, предназначенного, как мы это отмечали раньше, для форматированного вывода данных различного типа с целью их визуального отображения в виде текстовой строки.
Для работы со стандартным потоком вывода вы будете использовать главным образом методы print и println, хотя метод write также доступен.
В классе PrintStream определено несколько реализаций метода print с параметрами различных типов:
public void print(boolean b);public void print(char c);public void print(char s[]);public void print(double d);public void print(float f);public void print(int i);public void print(long l);public void print(Object obj);public void print(String s);
Как видите, вы можете записать в стандартный поток вывода текстовое представление данных различного типа, в том числе и класса Object.
Метод println аналогичен методу print, отличаясь лишь тем, что он добавляет к записываемой в поток строке символ перехода на следующую строку:
public void println();public void println(boolean b);public void println(char c);public void println(char s[]);public void println(double d);public void println(float f);public void println(int i);public void println(long l);public void println(Object obj);public void println(String s);
Реализация метода println без параметров записывает только символ перехода на следующую строку.
Стандртный поток вывода сообщений об ошибках
Стандртный поток вывода сообщений об ошибках err так же, как и стадартный поток вывода out, создан на базе класса PrintStream. Поэтому для записи сообщений об ошибках вы можете использовать только что описанные методы print и println.