Java ввод данных с клавиатуры

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);
    }
}
Существует и метод 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 работа с файлами


Каждое приложение, программа имеют возможности записи чего-либо в файл. В данном уроке я продемонстрирую как можно записать какие-то данные в файл, а потом считать их оттуда.

Какие проблемы мы будем решать в этом уроке?

1. Как записывать в файл?
2. Как читать файл?
3. Как обновить файл?
4. Как удалить файл?

Подготовительные работы

Создадим простой проект, не обязательно Maven проект, так как нам не потребуется не каких дополнительных библиотек.
После того как вы создали проект, создайте класс WorkInFile.java и напишите туда стандартную конструкцию main:
?
1
2
3
public static void main(String[] args){
   //тут будем вызывать наши методы
}
Теперь создадим класс который будет иметь методы для работы с файлами, а назовем его FileWorker.java все методы в нем которые не есть private будут статическими для того чтобы мы получали к ним доступ без экземпляра этого класса.

Как записывать в файл?

В классе FileWorker.java создадим статический метод который будет осуществлять запись в файл и назовем этот методwrite(String text; String nameFile):
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public static void write(String fileName, String text) {
    //Определяем файл
    File file = new File(fileName);
    try {
        //проверяем, что если файл не существует то создаем его
        if(!file.exists()){
            file.createNewFile();
        }
        //PrintWriter обеспечит возможности записи в файл
        PrintWriter out = new PrintWriter(file.getAbsoluteFile());
        try {
            //Записываем текст у файл
            out.print(text);
        } finally {
            //После чего мы должны закрыть файл
            //Иначе файл не запишется
            out.close();
        }
    } catch(IOException e) {
        throw new RuntimeException(e);
    }
}
Обратите особое внимание на то, что после записи каких либо данных в файл мы должны его закрыть, только после этого действия данные запишутся в файл.
?
1
2
3
4
5
6
7
8
9
private static String text = "This new text \nThis new text2\nThis new text3\nThis new text4\n";
private static String fileName = "C://blog/a.txt";
public static void main(String[] args) throws FileNotFoundException {
    //Запись в файл
    FileWorker.write(fileName, text);
}
После чего мы получим новый файл «a.txt» со следующим содержимым:
?
1
2
3
4
This new text
This new text2
This new text3
This new text4

2. Как читать файл?

Теперь в классе FileWorker создадим метод для чтения файла, также статический:
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
public static String read(String fileName) throws FileNotFoundException {
    //Этот спец. объект для построения строки
    StringBuilder sb = new StringBuilder();
    exists(fileName);
    try {
        //Объект для чтения файла в буфер
        BufferedReader in = new BufferedReader(new FileReader( file.getAbsoluteFile()));
        try {
            //В цикле построчно считываем файл
            String s;
            while ((s = in.readLine()) != null) {
                sb.append(s);
                sb.append("\n");
            }
        } finally {
            //Также не забываем закрыть файл
            in.close();
        }
    } catch(IOException e) {
        throw new RuntimeException(e);
    }
    //Возвращаем полученный текст с файла
    return sb.toString();
}
StringBuilder — в чем разница между обычным String? В том что когда  вы в StringBuilder добавляете текст он не пересоздается, а String пересоздает себя.
Также если файла нет то метод выкинет Exception.
Для проверки на существование файла создадим метод, так как нам еще потребуется эта проверка в следующих методах:
?
1
2
3
4
5
6
private static void exists(String fileName) throws FileNotFoundException {
    File file = new File(fileName);
    if (!file.exists()){
        throw new FileNotFoundException(file.getName());
    }
}
Теперь проверим его:
?
1
2
3
4
5
6
7
8
9
10
11
private static String text = "This new text \nThis new text2\nThis new text3\nThis new text4\n";
private static String fileName = "C://blog/a.txt";
public static void main(String[] args) throws FileNotFoundException {
    //Попытка прочитать несуществующий файл
    FileWorker.read("no_file.txt");
    //Чтение файла
    String textFromFile = FileWorker.read(fileName);
    System.out.println(textFromFile);
}
В первом случае когда файл не существует мы получим это:
?
1
2
Exception in thread "main" java.io.FileNotFoundException: no_file.txt
    at com.devcolibri.tools.FileWorker.read(FileWorker.java:31)
Во втором случае, мы получим содержимое файла в виде строки. (для этого закомментируйте первый случай)

3. Как обновить файл?

Как такого Update для файлов нет, но способ обновить его есть, для этого можно его перезаписать.
Давайте создадим метод update в классе FileWorker:
?
1
2
3
4
5
6
7
8
public static void update(String nameFile, String newText) throws FileNotFoundException {
    exists(fileName);
    StringBuilder sb = new StringBuilder();
    String oldFile = read(nameFile);
    sb.append(oldFile);
    sb.append(newText);
    write(nameFile, sb.toString());
}
Тут мы считываем старый файл в StringBuilder после чего добавляем к нему новый текст и записываем опять. Обратите внимание что для этого мы используем наши методы.
В результате обновления файла:
?
1
2
3
4
5
6
7
private static String text = "This new text \nThis new text2\nThis new text3\nThis new text4\n";
private static String fileName = "C://blog/a.txt";
public static void main(String[] args) throws FileNotFoundException {
    //Обновление файла
    FileWorker.update(fileName, "This new text");
}
мы получим следующее содержание файла «a.txt«:
?
1
2
3
4
5
This new text
This new text2
This new text3
This new text4
This new text

4. Как удалить файл?

В тот же наш утилитный класс FileWorker добавим метод delete, он будет очень простым так как у объекта File уже есть методdelete():
?
1
2
3
4
public static void delete(String nameFile) throws FileNotFoundException {
    exists(nameFile);
    new File(nameFile).delete();
}
Проверяем:
?
1
2
3
4
5
6
private static String fileName = "C://blog/a.txt";
public static void main(String[] args) throws FileNotFoundException {
    //Удаление файла
    FileWorker.delete(fileName);
}
После чего файл будет удален.

Статья с http://devcolibri.com/1141