JavaRush /Курсы /JAVA 25 SELF /Классы File, Path, Files: обзор, создание объектов

Классы File, Path, Files: обзор, создание объектов

JAVA 25 SELF
35 уровень , 1 лекция
Открыта

1. Класс File: как всё начиналось

Хоть мы с вами и выяснили, что класс File лучше не использовать в новых проектах, тем не менее есть множество legacy‑систем, где он применяется. Поэтому его важно понимать и уметь с ним работать. Класс File — это старый способ представлять файл или директорию на диске. Но не путайте: объект File — это не сам файл, а лишь «указатель»/паспорт пути. Например, выражение File f = new File("hello.txt"); не создаёт файл на диске — вы просто описали путь.

Как создать объект File?

import java.io.File;

public class FileDemo {
    public static void main(String[] args) {
        File file = new File("example.txt"); // относительный путь
        File folder = new File("mydir");     // директория

        System.out.println("Абсолютный путь: " + file.getAbsolutePath());
        System.out.println("Существует ли файл? " + file.exists());
        System.out.println("Это файл? " + file.isFile());
        System.out.println("Это директория? " + folder.isDirectory());
    }
}

Что важно помнить:
Создание объекта File не создаёт файл на диске. Это просто «ярлык». Чтобы файл реально появился, нужно явно инициировать создание (например, записать данные или вызвать file.createNewFile()).

Основные методы класса File

  • exists() — проверяет, существует ли файл/директория.
  • isFile() — это файл (а не папка)?
  • isDirectory() — это директория?
  • getAbsolutePath() — получить абсолютный путь.
  • length() — размер файла в байтах.
  • getName() — имя файла или папки.
  • delete() — удалить файл/директорию (если пустая).

Пример: выводим информацию о файле

File file = new File("example.txt");
System.out.println("Имя: " + file.getName());
System.out.println("Путь: " + file.getAbsolutePath());
System.out.println("Размер: " + file.length() + " байт");
System.out.println("Существует? " + file.exists());

2. Класс Path: современный взгляд на файлы

Path — часть нового файлового API (NIO.2, с Java 7). Это абстракция пути к файлу/директории, причём путь может быть не только на локальном диске, но и, например, внутри ZIP‑архива или на удалённом ресурсе (при наличии соответствующего провайдера).

Если File — это старая бумажная карта, то Path — GPS‑навигатор.

Как создать объект Path?

import java.nio.file.Path;
import java.nio.file.Paths;

public class PathDemo {
    public static void main(String[] args) {
        Path path1 = Paths.get("example.txt"); // относительный путь
        Path path2 = Paths.get("folder", "file.txt"); // склеиваем части пути

        System.out.println("Путь 1: " + path1.toAbsolutePath());
        System.out.println("Путь 2: " + path2.toAbsolutePath());
    }
}

Плюс: не нужно думать о разделителях. Paths.get подберёт корректный формат под вашу ОС.

Преобразование между File и Path

  • FilePath: file.toPath()
  • PathFile: path.toFile()
File file = new File("test.txt");
Path path = file.toPath();

Path anotherPath = Paths.get("data.txt");
File anotherFile = anotherPath.toFile();

Работа с путями: resolve, relativize, normalize

Склеивание путей (resolve)

Path dir = Paths.get("myfolder");
Path file = dir.resolve("notes.txt"); // myfolder/notes.txt
System.out.println(file); // myfolder/notes.txt

Относительный путь (relativize)

Path pathA = Paths.get("folderA/file1.txt");
Path pathB = Paths.get("folderA/subfolder/file2.txt");
Path relative = pathA.relativize(pathB);
System.out.println(relative); // ../subfolder/file2.txt

Нормализация пути (normalize)

Path messy = Paths.get("folder/../folder/file.txt");
Path clean = messy.normalize();
System.out.println(clean); // folder/file.txt

Пример: строим путь к файлу

Path home = Paths.get(System.getProperty("user.home"));
Path docs = home.resolve("Documents");
Path myFile = docs.resolve("myfile.txt");
System.out.println("Путь к файлу: " + myFile.toAbsolutePath());

3. Класс Files: ваш швейцарский нож

Класс Files из пакета java.nio.file — утилитный набор статических методов для работы с файлами и директориями поверх Path. Он умеет практически всё: проверять существование, создавать/удалять, читать/записывать, копировать/перемещать, получать атрибуты и обходить дерево каталогов.

Основные методы класса Files

  • Files.exists(path) — проверяет, существует ли файл/директория.
  • Files.isDirectory(path) — это директория?
  • Files.size(path) — размер файла.
  • Files.createFile(path) — создать файл.
  • Files.createDirectory(path) — создать директорию.
  • Files.delete(path) — удалить файл/директорию.
  • Files.copy(src, dest) — скопировать файл.
  • Files.move(src, dest) — переместить/переименовать.
  • Files.getLastModifiedTime(path) — время последнего изменения.
  • Files.readAllBytes(path) — прочитать весь файл в массив байт.
  • Files.readAllLines(path) — прочитать все строки текстового файла.
  • Files.write(path, bytes) — записать байты в файл.

Пример: проверяем файл

import java.nio.file.*;

public class FilesDemo {
    public static void main(String[] args) {
        Path path = Paths.get("example.txt");

        System.out.println("Файл существует? " + Files.exists(path));
        System.out.println("Это директория? " + Files.isDirectory(path));

        if (Files.exists(path)) {
            try {
                System.out.println("Размер файла: " + Files.size(path) + " байт");
            } catch (Exception e) {
                System.out.println("Ошибка при получении размера: " + e.getMessage());
            }
        }
    }
}

4. Практика: создаём объекты, выводим свойства

Создаём объекты для файла и директории

import java.io.File;
import java.nio.file.Path;
import java.nio.file.Paths;

public class CompareDemo {
    public static void main(String[] args) {
        // Старый способ
        File oldFile = new File("test.txt");
        File oldDir = new File("mydir");

        // Новый способ
        Path newFile = Paths.get("test.txt");
        Path newDir = Paths.get("mydir");

        System.out.println("=== File API ===");
        System.out.println("Файл: " + oldFile.getAbsolutePath());
        System.out.println("Существует? " + oldFile.exists());
        System.out.println("Это файл? " + oldFile.isFile());
        System.out.println("Это директория? " + oldDir.isDirectory());

        System.out.println("\n=== Path API ===");
        System.out.println("Файл: " + newFile.toAbsolutePath());
        System.out.println("Существует? " + java.nio.file.Files.exists(newFile));
        System.out.println("Это файл? " + java.nio.file.Files.isRegularFile(newFile));
        System.out.println("Это директория? " + java.nio.file.Files.isDirectory(newDir));
    }
}

Выводим свойства файла

import java.nio.file.*;

public class FileProperties {
    public static void main(String[] args) {
        Path path = Paths.get("test.txt");

        System.out.println("Абсолютный путь: " + path.toAbsolutePath());
        System.out.println("Имя файла: " + path.getFileName());
        System.out.println("Родительская папка: " + path.getParent());

        if (Files.exists(path)) {
            try {
                System.out.println("Размер: " + Files.size(path) + " байт");
                System.out.println("Последнее изменение: " + Files.getLastModifiedTime(path));
            } catch (Exception e) {
                System.out.println("Ошибка при получении информации: " + e.getMessage());
            }
        } else {
            System.out.println("Файл не найден.");
        }
    }
}

5. Сравнение: File vs Path/Files

Возможность File (java.io) Path + Files (java.nio.file)
Представление пути Только локальный диск Локальный диск, ZIP, сетевые ресурсы
Склеивание путей Ручное соединение через слэши Удобно через resolve
Проверка существования exists() Files.exists(path)
Чтение/запись содержимого Нет Да (Files.readAll..., Files.write)
Получение атрибутов Базовые (length(), lastModified()) Расширенные атрибуты и представления
Совместимость Со всеми версиями Java Java 7 и выше
Работа с симлинками Ограниченно Полная поддержка

Кратко: когда что использовать?

  • Для новых проектов — используйте Path и Files.
  • Для поддержки старого кода — иногда придётся работать с File.

6. Полезные нюансы

Относительные и абсолютные пути

Относительный путь — это путь относительно текущей рабочей директории; абсолютный — полный путь от корня файловой системы.

Path relative = Paths.get("data", "file.txt");
Path absolute = relative.toAbsolutePath();
System.out.println("Абсолютный путь: " + absolute);

Кроссплатформенность

Path и Files учитывают особенности ОС (разделители, кодировки и т. п.). Не пишите пути вручную вида "C:\\folder\\file.txt" — используйте Paths.get и resolve.

Преобразование между File и Path

Если у вас есть старый код на File, легко перейти на новое API:

File legacy = new File("legacy.txt");
Path modern = legacy.toPath();
if (Files.exists(modern)) {
    // Теперь можно использовать все возможности NIO.2
}

Проверка существования файла

Path path = Paths.get("notes.txt");
if (Files.exists(path)) {
    System.out.println("Файл найден!");
} else {
    System.out.println("Файл не существует.");
}

7. Мини‑практика: создаём и проверяем файл и директорию

import java.nio.file.*;

public class MiniPractice {
    public static void main(String[] args) throws Exception {
        Path dir = Paths.get("demo_dir");
        Path file = dir.resolve("hello.txt");

        // Создаём директорию, если её нет
        if (!Files.exists(dir)) {
            Files.createDirectory(dir);
            System.out.println("Директория создана: " + dir.toAbsolutePath());
        }

        // Создаём файл, если его нет
        if (!Files.exists(file)) {
            Files.createFile(file);
            System.out.println("Файл создан: " + file.toAbsolutePath());
        }

        // Выводим свойства
        System.out.println("Файл существует? " + Files.exists(file));
        System.out.println("Это файл? " + Files.isRegularFile(file));
        System.out.println("Размер: " + Files.size(file) + " байт");

        // Удаляем файл и директорию (по желанию)
        Files.delete(file);
        Files.delete(dir);
        System.out.println("Файл и директория удалены.");
    }
}

8. Типичные ошибки при работе с File/Path/Files

Ошибка №1: Путаница между File и Path. Многие новички пытаются использовать методы Files с объектом File. Помните: Files.* работает с Path. Если у вас есть File, сначала сделайте file.toPath().

Ошибка №2: Ожидание, что создание объекта File или Path создаёт файл. Объект пути — это ярлык, а не реальный файл. Для создания используйте Files.createFile(path) или запись данных.

Ошибка №3: Ручная сборка путей через строку. Не пишите "folder/file.txt" или "folder\\file.txt". Используйте Paths.get(...) и resolve(...). Это безопаснее и кроссплатформенно.

Ошибка №4: Игнорирование исключений. Операции с файлами выбрасывают IOException и другие исключения. Обрабатывайте их через try-catch или пробрасывайте выше (throws).

Ошибка №5: Проверка через File.exists(), а затем работа через Path. Старайтесь придерживаться одного стиля: начали с Path — используйте Files.exists(path) и остальные методы Files.

1
Задача
JAVA 25 SELF, 35 уровень, 1 лекция
Недоступна
Где сокровища? Проверка папки с игровыми ассетами 🎮
Где сокровища? Проверка папки с игровыми ассетами 🎮
1
Задача
JAVA 25 SELF, 35 уровень, 1 лекция
Недоступна
Собираем проект: полный путь к "главному" файлу 🏗️
Собираем проект: полный путь к "главному" файлу 🏗️
Комментарии
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ