java-lekcii-2016-01-17 / presentation-nov-14
.docxРабота с файлами
package ru.mami;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardOpenOption;
import java.util.Arrays;
import java.util.List;
public final class Main {
public static void main(String[] args) {
// получение адреса папки текущего пользователя в виде строки
String userHome = System.getProperty("user.home");
System.out.println(userHome); // C:\Users\<имя текущего пользователя>
// перевод адреса из строки в тип Path, который используется для работы
// с файлами и папками
Path userDir = Paths.get(userHome);
// добавление еще одного или нескольких объектов в конец адреса, т.е.
// customers = C:\Users\<пользователь>\nov-14\customers.txt
Path customers = userDir.resolve("nov-14/customers.txt");
// Во время работы с файлами могут возникнуть ошибки ввода-вывода,
// которые могут оказать серьезное влияние на работу компьютера в целом
// и программы в частности. Для обработки ошибок в Java используются
// блоки try ... catch. Несмотря на то, что ни на лабораторных, ни на
// экзамене никаких проблем с файлами не возникнет, не прописывать эти
// блоки нельзя (программа без них не заработает)
try {
// если папка, в которой должен лежать файл customers.txt не
// существует, создать ее и все ее родительские папки
if (!Files.exists(customers.getParent())) {
Files.createDirectories(customers.getParent());
}
// запись в файл
// первый параметр - файл, в который будут записаны данный
// второй параметр - сами строки
// Метод Files.write принимает в качестве второго параметра объект,
// реализующий интерфейс Iterable с объектами, реализуюшими
// интерфейс CharSequence. Метод Arrays.asList() возвращает список
// (объект, реализующий интерфейс List) и принимает в качестве
// параметра либо массив, либо любое количество объектов (в данном
// случае строк), записанных через запятую. Таким образом, метод
// Arrays.asList() можно использовать для создания второго параметра
// для метода Files.write()
// остальные (необязательные) параметры - режимы открытия файла.
// CREATE означает, что файл будет создан, если он отсутствует, а
// APPEND - что новые строки будут дописаны в конец файла (если бы
// APPEND не был прописан, этот вызов заменил бы первые две строки
// файла на 12 и 34)
Files.write(customers, Arrays.asList("12", "34"),
StandardOpenOption.CREATE,
StandardOpenOption.APPEND);
// чтение всех строк файла в список строк
// списки (классы, реализующие интерфейс List) можно рассматривать
// как более продвинутую форму массивов, т.к. они предоставляют
// большое количество функций, облегчающих работу со
// сгруппированными данными, а некоторые даже являются обертками над
// массивами
List<String> lines = Files.readAllLines(customers);
// вывод содержимого файла в консоль
for (String line : lines) {
System.out.println(line);
}
// добавление строки
lines.add("asdf");
// запись измененных строк в файл
// StandardOpenOption.TRUNCATE_EXISTING = очистить перед записью
Files.write(customers, lines, StandardOpenOption.TRUNCATE_EXISTING);
} catch (IOException e) {
e.printStackTrace();
}
}
}
Работа с регулярными выражениями
Регуля́рные выраже́ния (англ. regular expressions) — формальный язык поиска и осуществления манипуляций с подстроками в тексте, основанный на использовании метасимволов (символов-джокеров, англ. wildcard characters). По сути это строка-образец (англ. pattern, по-русски её часто называют «шаблоном», «маской»), состоящая из символов и метасимволов и задающая правило поиска.
package ru.mami;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public final class Main {
public static void main(String[] args) {
String line = "admin|qwerty";
// Pattern - подготовленное к работе регулярное выражение
// () - группа, используется для получения части выражения (см. далее)
// \\w - любая цифра, любая (английская) буква или символ подчеркивания
// + - одно или более совпадение подряд
// \\| - символ "|"
Pattern userPattern = Pattern.compile("(\\w+)\\|(\\w+)");
// Matcher - движок, сопостовляющий строку с шаблоном
Matcher userMatcher = userPattern.matcher(line);
// проверка, соответствует ли строка line шаблону userPattern
if (userMatcher.matches()) {
// если соответствует, вывод всех групп на экран
// группа 0 - все, что соответствует регулярному выражению, есть
// всегда
// группы 1+ - группы, выделенные в регулярном выражении круглыми
// скобками в том порядке, в котором они встречаются в выражении
System.out.println(userMatcher.group(0));
// admin|qwerty
System.out.println(userMatcher.group(1));
// admin
System.out.println(userMatcher.group(2));
// qwerty
}
// Альтернативный подход, применяемый в случае, когда нужно выяснить
// только соответствует ли вся строка регулярному выражению
if (Pattern.matches("\\w+", "Lorem ipsum")) {
System.out.println("passed");
} else {
System.out.println("failed");
}
// Пример сверху выводит failed, т.к. в строке Lorem ipsum есть пробел
}
}
Упражнения
-
Создать новый проект Gradle
-
Создать оконное приложения с полем вывода информации, кнопкой, полями ввода имени пользователя и пароля и кнопкой.
-
По нажатию кнопки проверять поля на соответствие регулярному выражению \\w+
-
Если хотя бы одно из полей не соответствует, писать об этом в поле вывода информации
-
Программно создать файл users.txt в котором хранить имена и пароли пользователей, разделенные символом «|»
-
Если оба поля соответствуют регулярному выражению, искать такого пользователя с таким паролем в базе
-
Если имя пользователя и пароль нашлись, сообщить пользователю об успешной аутентификации
-
Если нашлось только имя пользователя, сообщить о неправильно введенном пароле
-
Если имя пользователя не нашлось, добавить такого пользователя с таким паролем в файл
-
Собрать *.jar