Как считать строку в java
В Java для считывания строки с клавиатуры можно использовать класс Scanner , который позволяет получать данные от пользователя через стандартный поток ввода System.in .
Вот пример кода, который считывает строку с клавиатуры:
import java.util.Scanner; public class Main public static void main(String[] args) Scanner scanner = new Scanner(System.in); System.out.print("Введите строку: "); String line = scanner.nextLine(); System.out.println("Вы ввели строку: " + line); > >
В этом примере мы выполняем следующие действия:
- создаем объект класса Scanner и передаем ему стандартный поток ввода System.in ;
- затем мы выводим приглашение для пользователя с помощью метода print() и считываем введенную пользователем строку с помощью метода nextLine() ;
- наконец, мы выводим считанную строку на экран с помощью метода println()
Обратите внимание, что метод nextLine() считывает всю строку, включая пробелы и символы перевода строки. Если вы хотите считать только одно слово, то можете использовать метод next()
Класс Scanner.
Считывание символов
с клавиатуры
Вам может понадобиться возможность считать один единственный char. Например, для сохранения символа операции +, -, * или /, если вы пишите калькулятор, или ответа да-нет типа ‘y’ или ‘n’. Между тем Scanner представляет все возможности для считывания слов — он читает строки, целые и дробные числа, большие и малые числа, но вообще не предоставляет возможности прочесть один символ.
Возможно, так сделано потому, что Scanner задумывался как надстройка и расширение над базовой возможностью самого потока ввода System.in, который и предоставляет по сути одну функцию — прочесть символ с клавиатуры. Если вас устраивает возможность прочесть целое слово и при этом взять только самую начальную его букву, то можно написать так:
char c = myscan.next ().charAt (0); // next() дает слово, charAt (0) дает его символ под номером 0 // то есть мы получим необходимый нам символ
Функция next возвращает следующее слово, в нём может быть много букв. Более точно такое слово можно назвать String – строка. В строках может быть много букв, и через точку можно вызвать функцию, возвращающую букву по заданному номеру. Эту функцию зовут charAt, в скобках указывается номер символа, который мы хотим получить. Если интересует самый начальный символ, то нужно ввести ноль. Следующий символ будет 1, следующий – 2, и так далее. Это относительно простое решение, но здесь считывается в любом случае целое слово.
Возможно, что вам нужно прочесть один символ (один char), и вы не хотите читать для этого целое слово. Тогда можно написать так:
char c = (char) System.in.read ();
Теперь символ c можно будет использовать в программе, например, внутри условного оператора if (с == ‘+’) <…>.
…>
Помните, что конкретные значения символов мы указываем в кавычках: ‘a’, ‘b’, ‘c’, ‘+’, ‘1’ и т.д.
Как только вы напишите System.in.read () — система заголосит об ошибке. Чтобы её исправить, надо переиначить шапку main вот так, и все заработает:
public class JavaApplication5 < // осталось как было public static void main(String[] args) throws java.io.IOException < // добавили throws
Пояснение про throws exception. Эту фразу можно просто прочесть по-английски main throws IOException, что значит: main может кинуть исключения IO, т.е. ввода-вывода (in-out). Исключение - это остановка программы в том месте, когда она не может сработать нормально. То есть в обычных условиях все хорошо, но в исключительных (от сюда и название "исключение") - требуется обработка ошибки. Сейчас, дописав в заголовке main throws exception, мы просто предупредили систему, что это может произойти, и она успокоится.
Функция System.in.read() может кинуть исключение (по-английски throws exception). То есть когда программист видит, что данные явно ошибочны, можно написать "кинуть исключение" (throw exception). Так делает и функция read, если происходит что-то с потоком ввода, например, если клавиатура не подключена. Исключения нужно обрабатывать - писать код, который надо сделать, если произошла плохая ситуация. Мы это пройдем в будущем, а пока что просто передадим исключение наверх - пусть операционная система делает что хочет, если приложение сообщило об ошибке. Обычно она выведет на экран сообщение об ошибке и закроет программу, что нам сейчас и нужно. Чтобы передать исключение наверх, мы и пишем throws java.io.IOException.
Имейте в виду, System.in.read считывает всё по одному символу и, в отличие от Scanner, не разбирает таких тонкостей, как пробел или enter. Поэтому enter тоже считывается как обычный символ – у него есть свой код наравне с другими клавишами, обозначается '\n'. Учитывайте это, ведь обычно человек вводит не просто 'y', чтобы указать программе, как ей работать, но 'y'+'enter'. И второй enter будет считан вторым вызовом System.in.read ()
Самое главное мы уже освоили. Теперь время решать задачи. Ответьте на несколько вопросов, чтобы лучше усвоился новый материал:
Как посимвольно считать строку в java
Для того, чтобы считать строку посимвольно в Java , можно использовать метод toCharArray() класса String , который возвращает массив символов, представляющих строку. Затем можно перебирать элементы массива с помощью цикла for и обрабатывать их по мере необходимости.
Например, следующий код считывает строку с клавиатуры и выводит ее посимвольно в консоль:
import java.util.Scanner; public class Main public static void main(String[] args) Scanner scanner = new Scanner(System.in); System.out.print("Введите строку: "); String str = scanner.nextLine(); char[] charArray = str.toCharArray(); for (char c : charArray) System.out.println(c); > scanner.close(); > >
- В этом примере сначала создается объект Scanner для считывания ввода с клавиатуры.
- Затем пользователю предлагается ввести строку, которая сохраняется в переменной str .
- С помощью метода toCharArray() создается массив символов charArray , который затем перебирается с помощью цикла for-each .
- Как только все символы строки выведены, сканер закрывается с помощью метода close() .
Потоки ввода/вывода и строки в 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); >> > >