1. Введение
В программировании почти всегда нужно работать с файлами. Примеры знакомы каждому: сохранение текста заметки, прогресса в игре, копирование картинки или чтение настроек из конфигурационного файла.
В Java для этого есть современные и удобные инструменты: Path и Files из пакета java.nio.file. Они позволяют в несколько строк кода открыть файл, прочитать его содержимое, записать текст или даже скопировать картинку.
Путь к файлу (Path)
Файл всегда лежит где-то на диске, и чтобы к нему обратиться, нужно указать путь. Для этого в Java есть класс Path, а создать новый объект можно с помощью метода Path.of().
Path path = Path.of("hello.txt"); // относительный путь
Path absPath = Path.of("C:/Users/Me/image.png"); // абсолютный путь (Windows)
Пояснение:
- Относительный путь ищет файл в текущей папке проекта (например, "hello.txt").
- Абсолютный путь указывает полный адрес: диск, папки и имя файла.
2. Работа с текстовыми файлами
С точки зрения Java все файлы делятся на 2 типа — текстовые и бинарные. Если содержимое можно представить как текст, понятный человеку — это текстовый файл. Во всех остальных случаях — это просто набор байт (бинарный файл).
Запись текста в файл — writeString
Чтобы записать строку в файл, используем метод writeString.
Path p = Path.of("hello.txt");
Files.writeString(p, "Привет, файл!");
Что здесь произошло:
- создаём объект Path, который указывает на "hello.txt";
- методом writeString записываем туда строку;
- если файла не было, он создастся автоматически.
Таким образом можно легко сохранять заметки или сообщения в текстовый файл.
Чтение текста из файла — readString
Метод readString позволяет загрузить весь файл сразу в строку.
Path p = Path.of("hello.txt");
String content = Files.readString(p);
System.out.println(content);
Теперь в переменной content хранится содержимое файла. Это удобно для небольших файлов: конфигов, текстов, JSON-документов.
3. Работа с бинарными файлами
Не все файлы состоят из текста. Картинки, музыка, архивы — это наборы байтов. Для работы с ними есть методы write и readAllBytes.
Запись байтов в файл — write
Метод write() позволяет записать в файл массив байт. Его ещё называют буфером (byte buffer).
byte[] data = {65, 66, 67, 68}; // символы A B C D
Files.write(Path.of("letters.bin"), data);
Здесь мы записали в файл массив байтов. Если открыть файл как текст, внутри окажутся буквы "ABCD".
Чтение байтов — readAllBytes
Чтобы обратно получить содержимое файла в виде массива байтов, используем метод readAllBytes.
byte[] buffer = Files.readAllBytes(Path.of("letters.bin"));
// печатаем прочитанный массив байт на экран
for (byte b : buffer)
{
System.out.print((char)b + " ");
}
На экране появится:
A B C D
Такой способ используется для работы с любыми бинарными файлами — картинками, документами, музыкой.
4. Популярные сценарии работы с файлами
Самый популярный сценарий работы с файлами — это, пожалуй, копирование файла.
Копирование файлов
Чтобы скопировать файл, можно просто прочитать его в массив байтов и записать в другой файл.
Path in = Path.of("logo.png");
Path out = Path.of("logo_copy.png");
byte[] bytes = Files.readAllBytes(in);
Files.write(out, bytes);
Таким образом можно копировать изображения, документы и любые другие файлы, не заботясь об их формате.
Проверка существования и размера
Иногда нужно убедиться, что файл существует, и узнать его размер. Для этого есть методы exists и size.
Path p = Path.of("hello.txt");
if (Files.exists(p))
{
long size = Files.size(p);
System.out.println("Файл найден, размер: " + size + " байт");
}
else
{
System.out.println("Файл не найден!");
}
Это полезно для диагностики: вы точно будете знать, работаете ли вы с правильным файлом.
5. Исключения
Работа с файлами может завершиться ошибкой: файла нет, нет прав доступа, диск переполнен или файл занят другой программой. Поэтому нужно оборачивать работу с диском в try-catch, ну или пробрасывать исключения наружу с помощью throws.
try
{
String content = Files.readString(Path.of("hello.txt"));
System.out.println(content);
}
catch (IOException e)
{
System.out.println("Ошибка при чтении: " + e.getMessage());
}
Таким образом программа не «упадёт», а аккуратно сообщит пользователю, что произошло. Если требуется, можно пробросить исключение IOException дальше по стэку методом с ключевым словом throws.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ