JavaRush/Java блог/Архив info.javarush/Потоки ввода/вывода и строки в Java
articles
15 уровень

Потоки ввода/вывода и строки в Java

Статья из группы Архив info.javarush
участников
Для ввода данных используется класс Scanner из библиотеки пакетов Java. Потоки ввода/вывода и строки в Java - 1Этот класс надо импортировать в той программе, где он будет использоваться. Это делается до начала открытого класса в коде программы. В классе есть методы для чтения очередного символа заданного типа со стандартного потока ввода, а также для проверки существования такого символа. Для работы с потоком ввода необходимо создать объект класса 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);
    }
}
Существует и метод hasNext(), проверяющий остались ли в потоке ввода какие-то символы. В классе String существует масса полезных методов, которые можно применять к строкам (перед именем метода будем указывать тип того значения, которое он возвращает):
  1. int length() — возвращает длину строки (количество символов в ней);
  2. boolean isEmpty() — проверяет, пустая ли строка;
  3. String replace(a, b) — возвращает строку, где символ a (литерал или переменная типа char) заменён на символ b;
  4. String toLowerCase() — возвращает строку, где все символы исходной строки преобразованы к строчным;
  5. String toUpperCase() — возвращает строку, где все символы исходной строки преобразованы к прописным;
  6. boolean equals(s) — возвращает истинну, если строка к которой применён метод, совпадает со строкой s указанной в аргументе метода (с помощью оператора == строки сравнивать нельзя, как и любые другие объекты);
  7. int indexOf(ch) — возвращает индекс символа ch в строке (индекс это порядковый номер символа, но нумероваться символы начинают с нуля). Если символ совсем не будет найден, то возвратит -1. Если символ встречается в строке нескольо раз, то вовзвратит индекс его первого вхождения.
  8. int lastIndexOf(ch) — аналогичен предыдущему методу, но возвращает индекс последнего вхождения, если смивол встретился в строке несколько раз.
  9. int indexOf(ch,n) — возвращает индекс символа ch в строке, но начинает проверку с индекса n (индекс это порядковый номер символа, но нумероваться символы начинают с нуля).
  10. char charAt(n) — возвращает код символа, находящегося в строке под индексом n (индекс это порядковый номер символа, но нумероваться символы начинают с нуля).
public class Main {
    public static void main(String[] args) {
        String s1 = "firefox";
        System.out.println(s1.toUpperCase()); // выведет «FIREFOX»
        String s2 = s1.replace('o', 'a');
        System.out.println(s2); // выведет «firefax»
        System.out.println(s2.charAt(1)); // выведет «i»
        int i;
        i = s1.length();
        System.out.println(i); // выведет 7
        i = s1.indexOf('f');
        System.out.println(i); // выведет 0
        i = s1.indexOf('r');
        System.out.println(i); // выведет 2
        i = s1.lastIndexOf('f');
        System.out.println(i); // выведет 4
        i = s1.indexOf('t');
        System.out.println(i); // выведет -1
        i = s1.indexOf('r',3);
        System.out.println(i); // выведет -1
    }
}
Пример программы, которая выведет на экран индексы всех пробелов в строке, введенноё пользователем с клавиатуры:
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
Комментарии (30)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Anastasiia
Уровень 7
Expert
29 января, 09:05
иду по порядку курса и вообще непонятно
Байрам
Уровень 19
Expert
27 октября 2023, 11:50
так то все понятно, осталось запомнить
rickjames
Уровень 6
21 апреля 2023, 18:20
Ссылка на первоисточник: вообще на какой-то скам похожа.
Bazylka
Уровень 16
2 марта 2023, 17:14
<Почему в charAt используют одинарные кавычки, а не двойные?> Двойные кавычки используются для переменных типа String (строка), а одинарные - для переменных типа Char (символ)
Глеб
Уровень 10
14 февраля 2023, 09:02
Ссылка на первоисточник уже не актуальна.
Artem
Уровень 23
25 ноября 2022, 14:29
Почему в charAt используют одинарные кавычки, а не двойные?
Anonymous #3081516
Уровень 4
1 сентября 2022, 19:23
странно, элементарно же, но почему такой результат?
Daniel CEO в BicycleInventionAcad
15 октября 2022, 14:55
Оказалось, что я сам не понимаю, как работает Scanner, хотя столько раз им пользовался. Вот объяснение, что именно происходит. Но почему так происходит сказать пока не могу. Напишу, когда разберусь и если разберусь. https://ru.stackoverflow.com/questions/991065/%D0%9D%D0%B5-%D0%BE%D1%82%D1%80%D0%B0%D0%B1%D0%B0%D1%82%D1%8B%D0%B2%D0%B0%D0%B5%D1%82-scanner-%D0%B2%D0%BE-%D0%B2%D1%82%D0%BE%D1%80%D0%BE%D0%B9-%D1%80%D0%B0%D0%B7
Daniel CEO в BicycleInventionAcad
15 октября 2022, 15:40
Все оказалось сильно прозаичнее. Это просто баг IDEA, который был в версии 2022.1.1 и исправлен в более поздних версиях. Фиксится обновлением IDE (наличие обновлений можно посмотреть в File - Settings - Appearance & Behavior - System Settings - Updates). Вот ссылка на багрепорт. https://javarush.com/forum/1553
Anonymous #3110035
Уровень 2
12 августа 2022, 13:14
Так же хотелось бы большего понимания того, что автор пытается донести. Закрадывается вопрос: Это учебная площадка рассчитана на то, что я уже что-то знаю, или же тут обучают с нуля? Мой уровень программирования 0.01 пройден первый уровень .... Где пояснения того, как в метод затесалась переменная например ?
import java.util.Scanner; // импортируем класс
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in); // создаём объект класса Scanner
        int i = 2;
В обучении мне говорили про классы в которых содержаться переменные и методы, но не про методы с переменными в них, пока что со своей колокольни я вижу только наличие кода в методах (функциях), почему об этом не идет речи в 1 вом уровне?
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("Вы ввели не целое число");
Ну а тут вообще уже абра кадабра🧙‍♂️, если что магия вне Хогвартса запрещена✋. Как видно создан объект ввода - клавиатура System.in, но что значит sc перед классом Scanner - это имя ? И как объяснить следующие строки, что бы не просто списать , а понять глубинный смысл ?
if(sc.hasNextInt()) { // возвращает истину если с потока ввода можно считать целое число
         i = sc.nextInt(); // считывает целое число с потока ввода и сохраняем в переменную
Daniel CEO в BicycleInventionAcad
15 октября 2022, 14:08
Все рассказывается, просто нужно внимательнее читать и обдумывать прочитанное. Вообще в принципе лично у меня так получилось: сначала ничего не понятно, причем долго, а потом бах и все встает на свои места, но оказывается, что теперь появилась еще куча вопросов, но они уже осмысленные. Так что конкретно в вашем случае советую начать не с изучения технической части, а с изменения подхода к процессу. Изучать программирование это долго, сложно и больно. И вам должно нравиться, когда сложно и больно, иначе будет не интересно, и ничем это не закончится.
Anonymous #3110035
Уровень 2
12 августа 2022, 13:07
Абсолютно не важно, что в коде прописано:
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);
Объяснение при этом выглядит немного запутанным: Метод hasNextDouble(), применённый объекту класса Scanner, проверяет, можно ли считать с потока ввода вещественное число типа double, а метод nextDouble() — считывает его. Почему бы не использовать hasNextInt() и nextInt() - типичная халатность на мой взгляд, и это только начало статьи, на которую я попал после прохождения первого уровня👌, мне действительно нужно понимать автора с полу слова, зачем мне тогда платить за подписку, если я и сам сусам?
Gennady Zakharov
Уровень 2
18 июля 2022, 05:58
Потому что символа (t) нет в слове “fierfox”