Работа с файлами

Программа солиднее, когда она умеет сохранять или читать что-то из файлов. Пусть это даже не будет база данных. Так давайте научимся создавать, удалять, читать, записывать файлы (бонус: папки).

Про файлы в целом

Как вы знаете, файлы хранятся на носителях. Не будем вдаваться в подробности электрических зарядов или магнитных полей, а также всяких нулей и единичек. Мы – на вершине абстракции. Но некоторые вещи про файлы знать нужно для корректной работы с ними.

Например, файлы не могут иметь любое имя, какое вы захотите. Есть запрещённые символы: \/:*?”<>|. Также длина названия может быть не любой. Зависит от местоположения файла и ОС: например, в Windows максимальная длина пути обычно составляет 260 символов, включая имя файла и путь к нему. В некоторых Unix-подобных системах ограничения могут быть менее строгими.

Также в разных ОС может учитываться или не учитываться регистр в названиях файлов. Например, в Windows “file.txt” и “File.txt” – разные файлы, когда в Unix это – одинаковое название.

И напоследок про 2 вида пути к файлу или папке:

  • Абсолютный путь указывает полное местоположение файла или папки в файловой системе, начиная от корневого каталога. Точное расположение файла, от самого диска, как здесь: “C:\Program Files\Adobe\Adobe Illustrator 2023“.
  • Относительный путь указывает местоположение файла или папки относительно текущего каталога. Это удобно для работы с файлами внутри проекта. Например: “Images\img1.png“, то есть от текущего расположения перейти в папку Images и найти там файл img1.png.

Так как в коде символ обратного слеша (\) зарезервирован для экранирования escape-последовательностей, то нужно ставить в строке пути вместо одного такого слеша два (\\).

FileReader и FileWriter

Эти два класса – два брата-акробата, которые удобно использовать, если вы хотите читать и писать символы (то есть текстовую информацию) в файлах. К ним присоединяются ещё два приятеля – BufferedReader и BufferedWriter. Давайте обо всём по порядку.

Создание файла:

Вывод в консоль успешного результата создания файла
Список файлов проекта IntelliJ IDEA
Содержимое файла file.txt

Если что-то идёт не так при создании файла, будет выброшено исключение IOException. И вы обязаны его обработать или дописать throws в шапке метода, иначе программа не скомпилируется.

Удаление файла:

Список файлов проекта IntelliJ IDEA
Вывод в консоль успешного результата удаления файла
Список файлов проекта IntelliJ IDEA

Чтение из файла:

Содержимое файла file.txt
Вывод в консоль содержимого файла

Запись в файл:

Содержимое файла file.txt
Вывод в консоль отсутствия ошибок при операции с файлом
Содержимое файла file.txt

Дозапись в конец файла без стирания предыдущего содержимого – нужно только добавить true в конструктор FileWriter:

Содержимое файла file.txt
Вывод в консоль отсутствия ошибок при операции с файлом
Содержимое файла file.txt

Создание папки:

Вывод в консоль успешного создания папки
Список файлов проекта IntelliJ IDEA
Содержимое папки ya_papka

А удаление папки происходит ровно таким же методом, как и файла:

Список файлов проекта IntelliJ IDEA
Вывод в консоль успешного удаления папки
Список файлов проекта IntelliJ IDEA

FileInputStream и FileOutputStream

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

Чтение из файла:

Содержимое файла file.txt
Вывод в консоль байтов из файла с текстом "Привет!"

В данном случае переменная content имеет тип int, а не byte, чтобы иметь возможность считать не только диапазон 0-255, но и -1, который будет сигнализировать о конце файла.

Запись в файл:

Содержимое файла file.txt
Вывод в консоль отсутствия ошибок при работе с файлом
Содержимое файла file.txt

Как и для FileWriter, здесь для FileOutputStream нужно указать вторым параметром в конструкторе true, чтобы дозаписать в конец файла информацию:

Содержимое файла file.txt
Вывод в консоль отсутствия ошибок при работе с файлом
Содержимое файла file.txt

java.nio.file.Files

Есть один прикольный класс, Files из пакета java.nio.file, который предоставляет возможности делать с файлами и папками всё. Буквально, целая куча различных операций. Методов очень много, поэтому мы кратко пробежимся по их объявлениям, параметрам и возвращаемым типам.

Перед этим нужно познакомиться с классом Path, который участвует практически во всех операциях класса Files. Он отражает путь до файла или папки, с которыми будем работать. Его объект можно так:

Итак, краткий обзор самых используемых методов из класса Files (они все статические):

  • Path createFile(Path path)создание нового файла по пути path
  • Path createDirectory(Path path)создание новой папки по пути path
  • Path createDirectories(Path path) создание папок и подпапок, если требуется, по пути path
  • void delete(Path path)удаление либо файла, либо папки (причём папка обязана быть пустой)
  • Path copy(Path src, Path dest)копирование файла в другое место
  • Path move(Path src, Path dest)перемещение файла в другое место
  • boolean isDirectory(Path path)проверка, является ли объект папкой, а не файлом
  • boolean isRegularFile(Path path)проверка наоборот, является ли объект файлом, а не папкой
  • boolean exists(Path path)проверка, существует ли объект по пути path
  • byte[] readAllBytes(Path path)чтение всех байт из файла
  • String readString(Path path)чтение всего файла и возврат содержимого как одной строки
  • List<String> readAllLines(Path path) чтение всего файла и возврат содержимого как список строк
  • Path write(Path path, byte[])запись в файл массива байт
  • Path writeString(Path path, String str)запись в файл строки
  • DirectoryStream<Path> newDirectoryStream(Path dir) – получение содержимого папки (её внутренние файлы и папки)

Давайте протестируем самый причудливый метод – последний. Он позволяет узнать, что находится в папке. Выведем в консоль список файлов внутри папки target -> classes внутри проекта:

Список файлов проекта IntelliJ IDEA в папке target/classes
Вывод в консоль списка файлов и папок внутри просматриваемой папки

Программы, которые умеют оперировать с данными во время выполнения – это, конечно хорошо. Но данные нужны и после перезапуска программы. Например, сохранение настроек приложения, аккаунта пользователя или его записей. Также запись и чтение файлов может быть применимо в более широких операциях – прослушивание песен, просмотр видео и т.д.

Добавить комментарий