JavaRush /Курсы /Java Syntax Pro /Знакомство с файлами

Знакомство с файлами

Java Syntax Pro
15 уровень , 4 лекция
Открыта

1. Класс Path

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

В ранних версиях Java для работы с файлами использовались классы типа File и FileInputStream. Но теперь класс File считается устаревшим, и использовать его не рекомендуется. Вы, конечно, можете еще встретить его в коде, параметрах методов или конструкторах классов.

Мы будем начинать изучение работы с файлами сразу с класса Path. Path — это класс, который пришел на смену File. Работа с ним безопаснее и эффективнее.

Класс Path

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

У Windows свои стандарты написания пути файлов, у Linux — свои. А ведь в мире еще много операционных систем, и у каждой — свои стандарты.

Поэтому везде в методах для работы с файлами указан интерфейс Path, а реально работа идет с его классами-наследниками: WindowsPath, UnixPath, ...

Создание объекта Path

Чтобы создать объект Path (на самом деле это будет объект класса-наследника — WindowsPath), нужно воспользоваться командой вида:

Path имя = Path.of(путь);

Где имя — это имя переменной типа Path. путь — это путь к файлу (или директории) вместе с именем файла (или директории). А of — статический метод класса Path.

Метод of() используется для того, чтобы создать объекты типа WindowsPath если программа запускается под Windows, а если программа запускается под Linux — объекты UnixPath. Вы не можете создать объект типа Path с помощью кода вида new Path().

Примеры:

Код Примечание
Path file = Path.of("c:\\projects\\note.txt");
Путь к файлу
Path directory = Path.of("c:\\projects\\");
Путь к директории

Файл (или директория) не обязаны существовать, чтобы мог существовать валидный объект типа Path. Может вы только хотите создать файл... Объект типа Path — это как продвинутая версия типа String — он не привязан к конкретному файлу на диске: он просто хранит некий путь на диске и все.


2. Методы типа Path

У интерфейса Path есть довольно много интересных методов. Самые интересные представлены в таблице ниже.

Метод Описание
Path getParent()
Возвращает родительскую директорию
Path getFileName()
Возвращает имя файла без директории
Path getRoot()
Возвращает корневую директорию из пути
boolean isAbsolute()
Проверяет, что текущий путь — абсолютный
Path toAbsolutePath()
Преобразует путь в абсолютный
Path normalize()
Убирает шаблоны в имени директории.
Path resolve(Path other)
Строит новый абсолютный путь из абсолютного и относительного.
Path relativize(Path other)
Получает относительный путь из двух абсолютных путей.
boolean startsWith(Path other)
Проверяет, что текущий путь начинается с пути
boolean endsWith(Path other)
Проверяет, что текущий путь заканчивается на путь
int getNameCount()
Дробит путь на части с помощью разделителя /.
Возвращает количество частей.
Path getName(int index)
Дробит путь на части с помощью разделителя /.
Возвращает часть по ее номеру.
Path subpath(int beginIndex, int endIndex)
Дробит путь на части с помощью разделителя /.
Возвращает часть пути, заданную интервалом.
File toFile()
Преобразует объект Path в устаревший объект File
URI toUri()
Преобразует объект Path в объект типа URI

Ниже идет краткое описание существующих методов.


3. Разделение пути на части

Метод getParent() возвращает путь, который указывает на родительскую директорию для текущего пути. Независимо от того, был этот путь директорией или файлом:

Код Значение
String str = "c:\\windows\\projects\\note.txt";
Path path = Path.of(str).getParent();
"c:\\windows\\projects\\"
String str = "c:\\windows\\projects\\";
Path path = Path.of(str).getParent();
"c:\\windows\\"
String str = "c:\\";
Path path = Path.of(str).getParent();
null

Метод getFileName() возвращает одно имя файла (или директории) — то, что идет после последнего разделителя:

Код Значение
String str = "c:\\windows\\projects\\note.txt";
Path path = Path.of(str).getFileName();
"note.txt"
String str = "c:\\windows\\projects\\";
Path path = Path.of(str).getFileName();
"projects"
String str = "c:\\";
Path path = Path.of(str).getFileName();
null

Метод getRoot() возвращает путь к корневой директории:

Код Значение
String str = "c:\\windows\\projects\\";
Path path = Path.of(str).getRoot();
"c:\\"


4. Абсолютный и относительный пути

Пути бывают двух типов: абсолютные и относительные. Абсолютный путь начинается с корневой директории. Для Windows это может быть папка c:\, для Linux — директория /

Относительный путь считается относительно какой-то директории. Т.е. это как бы конец пути, но только без начала. Относительный путь можно превратить в абсолютный и наоборот

Метод boolean isAbsolute()

Метод проверяет, является ли текущий путь абсолютным

Код Значение
String str = "c:\\windows\\projects\\note.txt";
boolean abs = Path.of(str).isAbsolute();
true
String str = "src\\com\\javarush\\Main.java";
boolean abs = Path.of(str).isAbsolute();
false

Метод Path toAbsolutePath()

Превращает путь в абсолютный, если нужно — добавляет к нему текущую рабочую директорию:

Код Значение
String str = "c:\\windows\\projects\\note.txt";
Path path = Path.of(str).toAbsolutePath();
"c:\\windows\\projects\\note.txt"
String str = "src\\com\\javarush\\Main.java";
Path path = Path.of(str).toAbsolutePath();
"d:\\work\\src\\com\\javarush\\Main.java"

Метод Path normalize()

В пути вместо имени директории можно писать «..», и это будет означать вернуться на одну директорию назад. Нормализация устраняет эти вещи. Примеры:

Код Значение
String str = "c:\\windows\\..\\projects\\note.txt";
Path path = Path.of(str).normalize();
"c:\\projects\\note.txt"
String str = "src\\com\\javarush\\..\\Main.java";
Path path = Path.of(str).normalize();
"src\\com\\Main.java"

Метод Path relativize(Path other)

Метод relativize() позволяет вычислить «разницу путей»: один путь относительно другого

Код Значение
Path path1 = Path.of("c:\\windows\\projects\\note.txt");
Path path2 = Path.of("c:\\windows\\"); Path result = path2.relativize(path1);
"projects\\note.txt"
Path path1 = Path.of("c:\\windows\\projects\\note.txt");
Path path2 = Path.of("c:\\windows\\"); Path result = path1.relativize(path2);
"..\\.."
Path path1 = Path.of("c:\\aaa\\bbb\\1.txt");
Path path2 = Path.of("d:\\zzz\\y.jpg"); Path result = path1.relativize(path2);
Ошибка IllegalArgumentException:
два пути имеют разный "корень" (разные диски)

Метод Path resolve(Path other)

Метод resolve() выполняет операцию, обратную relativize(): из абсолютного и относительного пути он строит новый абсолютный путь.

Код Значение
Path path1 = Path.of("projects\\note.txt");
Path path2 = Path.of("c:\\windows\\");
Path result = path1.resolve(path2);
"c:\\windows"
Path path1 = Path.of("projects\\note.txt");
Path path2 = Path.of("c:\\windows\\");
Path result = path2.resolve(path1);
"c:\\windows\\projects\\note.txt"

Метод toFile()

Метод возвращает устаревший объект File, который хранит тот же путь к файлу, что и объект Path.

Метод toURI()

Метод преобразует путь к стандарту URI, возвращает объект, который содержит путь к файлу:

Путь к файлу URI к файлу
c:\windows\projects\note.txt
file:///c:/windows/projects/note.txt

Комментарии (314)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Grigoryvvv Уровень 17 Expert
14 апреля 2026
15.04.2026 / 16 уровень Абсолютный и относительный путь (Windows, Java Path) 🔹 Абсолютный путь 📌 Путь считается абсолютным, если: начинается с " \ " → от корня текущего диска или " C:\... " → от корня конкретного диска, в данном примере диск C: Примеры: C:\file.txt 📌 \file.txt 📌 🔹 Относительный путь 📍 Считается от "текущей рабочей директории" (Current Working Directory - CWD). Примеры: file.txt 📍 folder\file.txt 📍 ..\file.txt 📍 ⚠️ Особый случай C:file.txt 📍 👉 это не абсолютный путь (это путь от текущей папки диска C) 📊 Быстрое правило Путь file.txt 📍 \file.txt 📌 C:\file.txt 📌 C:file.txt 📍 💡 Суть абсолютного и относительного пути есть \ или C:\ → абсолютный путь иначе → относительный 🔹метод isAbsolute() Path.of(path).isAbsolute(); Метод: ❌ не проверяет файл ❌ не обращается к файловой системе ✅ анализирует только строку, есть \ или C:\ → абсолютный путь, иначе → относительный
Grigoryvvv Уровень 17 Expert
14 апреля 2026
Current Working Directory (CWD) (текущая рабочая директория) 🔹 Метод toAbsolutePath() path.toAbsolutePath(); 👉 превращает путь в абсолютный, просто добавляя к "текущей рабочей директории (CWD)" заданный относительный путь к файлу. Сurrent Working Directory (CWD) (текущая рабочая директория) — это папка, которая используется как базовая точка для построения путей в файловых операциях, выполняемых программой. 👉 Проще: это папка, к которой «добавляется» относительный путь, чтобы получить абсолютный путь к файлу. 🧠 Мини-пример CWD = C:\projects\app // текущая рабочая директория Path.of("file.txt") // относительный путь 👉 получается после применения toAbsolutePath(): C:\projects\app\file.txt // абсолютный путь Порядок установки Сurrent Working Directory: 🔹 При запуске программы (нажатии кнопки ▶ в IntelliJ IDEA) IntelliJ IDEA запускает JVM как отдельный процесс через операционную систему (ОС) IntelliJ IDEA передаёт ОС параметры запуска процесса, включая Сurrent working directory 🔹 В IntelliJ IDEA CWD задаётся в настройках IDEA, а ещё точнее в пункте Run Configuration, по умолчанию: $PROJECT_DIR$ (папка проекта) 🔹 Роль ОС ОС: создаёт процесс JVM устанавливает Сurrent working directory как часть параметров процесса 🔹 Во время выполнения JVM стартует уже с установленным Сurrent working directory Java API (Path, Files, File) использует CWD как базовую папку для всех относительных путей 🔥 Итог (очень коротко): 👉 IntelliJ задаёт CWD → 👉 ОС запускает JVM с этим CWD → 👉 Java использует его для относительных путей Если программа уже собрана и вы запускаете её не из IDEA, то CWD определяется не IntelliJ IDEA, а тем местом, откуда вы запустили программу.
Grigoryvvv Уровень 17 Expert
16 апреля 2026
ВАЖНО: 👉 Относительные пути в Java не "привязаны" к CWD сами по себе, но используют его при необходимости взаимодействия с файловой системой или получения абсолютного пути. 👉 В IntelliJ IDEA по умолчанию CWD — это папка проекта, но её можно изменить в настройках Run Configuration. ● Использование CWD методами интерфейса Path Конкретно в интерфейсе Path только метод toAbsolutePath() использует Current Working Directory (CWD) для привязки относительного пути к реальному расположению в файловой системе. Остальные методы Path не используют CWD и не обращаются к файловой системе. Они выполняют только логические (синтаксические, математические) операции над путями: - разбор (getParent, getFileName) - проверка (isAbsolute, startsWith) - преобразование (normalize) - операции (resolve, relativize) Это сделано для того, чтобы: - методы были детерминированными (результат зависит только от входных данных) - результат не зависел от среды выполнения - поведение было предсказуемым
AlexSa4kov Уровень 25
12 февраля 2026
Господа (и Дамы), у меня одного возникает мысль, что с 15го уровня что-то поменялось? Изложение стало хуже, а соответствие лекции задачам - вообще утратило всякий смысл....🤔🤔🤔🤔🤔
Rei Уровень 32
3 февраля 2026
resolve() работает ТАК: 👉 если второй путь (other) — АБСОЛЮТНЫЙ, первый путь ИГНОРИРУЕТСЯ Базовое правило resolve() : base.resolve(other) если other ОТНОСИТЕЛЬНЫЙ → он приклеивается если other АБСОЛЮТНЫЙ → он побеждает, base выкидывается
Anonymous #3519817 Уровень 18
18 января 2026
Почему решение println(path) считается верным, а если написать println(path.toString()) то решение сразу не верное?
Обезьяна Уровень 43
25 января 2026
Вообще правильно, но просто sout уже сам под копотом делает toString()
Yokei Уровень 18
13 декабря 2025

        Scanner scanner = new Scanner(System.in);
        String str = scanner.nextLine();
        //напишите тут ваш код
        var path = Path.of(str);
        if (path.isAbsolute() && path.isAbsolute() && path.isAbsolute()) {
            var absolute = path.toAbsolutePath();
            System.out.println(absolute);
        }
Достаточно проверок на абсолютный путь?! метод toAbsolutePath и так сам проверяет абсолютный ли путь или нет :)
Владимир Уровень 26
10 сентября 2025
В задаче, где все относительно оказалось, что нужно обработать исключение, если пути вообще разные, и исключение поймать и ничего не делать
Кот Уровень 19
12 октября 2025
Да, очень странно... С хрен знает какой попытки прошла валидатор, результат выводит - неверный - (../c:\\test\test.txt вместо test\test.txt), исключение не завершает процесс.
30 августа 2025
Забавно, что в последней задаче, если ты вывод пути производишь не в теле условного оператора, то задача валится. Но если запихнешь все внутрь условного оператора, то валидатор пропускает такое
Tatyana Ponomareva Уровень 31
12 сентября 2025
у меня не в теле и не валится, все ок. Но к валидатору много вопросиков...
Руслан Уровень 48
30 августа 2025
Вот про подводные камни этих методов ни слова не сказано
Олег Петиш Уровень 51
6 августа 2025
После того как завершится курс, я буду иметь доступ к нему?
Елена Уровень 42
12 августа 2025
К лекциям доступ останется, а к задачам и играм доступ, как мне написал куратор, закроют через 2-3 месяца после завершения курса.
NinaInfinity Уровень 21
25 июля 2025
Эта лекция прям полегче)