Работа с файловой системой в Java: практическое руководство

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Работа с файловой системой в Java: практическое руководство

Работа с файловой системой — одна из фундаментальных задач в программировании. В Java для этого существует мощный и гибкий набор инструментов, начиная от классического пакета java.io и заканчивая современным java.nio.file. В этой статье мы на практических примерах разберём, как создавать, читать, записывать и удалять файлы, а также работать с директориями.

1. Класс File: основа работы с файлами

Класс java.io.File — это базовый класс для представления пути к файлу или директории. Он позволяет проверять существование, создавать, переименовывать и удалять объекты файловой системы.

Создание и проверка существования файла

import java.io.File;
import java.io.IOException;

public class FileExample {
    public static void main(String[] args) {
        File file = new File("example.txt");

        if (file.exists()) {
            System.out.println("Файл существует: " + file.getAbsolutePath());
        } else {
            try {
                if (file.createNewFile()) {
                    System.out.println("Файл создан: " + file.getName());
                }
            } catch (IOException e) {
                System.err.println("Ошибка создания файла: " + e.getMessage());
            }
        }

        // Проверка свойств
        System.out.println("Читаемый: " + file.canRead());
        System.out.println("Записываемый: " + file.canWrite());
        System.out.println("Размер: " + file.length() + " байт");
    }
}

Работа с директориями

File dir = new File("my_directory");

if (dir.mkdir()) {
    System.out.println("Директория создана");
}

// Создание вложенных директорий
File nestedDir = new File("parent/child/grandchild");
if (nestedDir.mkdirs()) {
    System.out.println("Вложенные директории созданы");
}

// Получение списка файлов
String[] files = dir.list();
for (String fileName : files) {
    System.out.println(fileName);
}

2. Чтение и запись файлов через FileReader/FileWriter

Для работы с текстовыми файлами удобно использовать классы FileReader и FileWriter. Они работают на уровне символов и поддерживают кодировки.

Запись в файл

import java.io.FileWriter;
import java.io.IOException;

public class WriteExample {
    public static void main(String[] args) {
        try (FileWriter writer = new FileWriter("output.txt", true)) {
            writer.write("Привет, мир!\n");
            writer.write("Это вторая строка.\n");
            writer.flush();
            System.out.println("Данные записаны успешно");
        } catch (IOException e) {
            System.err.println("Ошибка записи: " + e.getMessage());
        }
    }
}

Обратите внимание: второй параметр true в конструкторе FileWriter включает режим дозаписи (append). Если его опустить, файл будет перезаписан.

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

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class ReadExample {
    public static void main(String[] args) {
        try (BufferedReader reader = new BufferedReader(new FileReader("output.txt"))) {
            String line;
            while ((line = reader.readLine()) != null) {
                System.out.println(line);
            }
        } catch (IOException e) {
            System.err.println("Ошибка чтения: " + e.getMessage());
        }
    }
}

Использование BufferedReader значительно ускоряет чтение больших файлов за счёт буферизации.

3. Современный подход: java.nio.file (NIO.2)

Начиная с Java 7, появился пакет java.nio.file, который предоставляет более удобные и производительные инструменты для работы с файловой системой. Ключевые классы: Path, Files и FileSystem.

Создание и запись файла

import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardOpenOption;
import java.io.IOException;
import java.util.List;

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

        try {
            // Создание и запись строк
            Files.writeString(path, "Строка 1\nСтрока 2\n", StandardOpenOption.CREATE);
            
            // Дозапись
            Files.writeString(path, "Добавленная строка\n", StandardOpenOption.APPEND);

            // Запись списка строк
            List<String> lines = List.of("Строка A", "Строка B", "Строка C");
            Files.write(path, lines, StandardOpenOption.CREATE);

            System.out.println("Файл создан: " + path.toAbsolutePath());
        } catch (IOException e) {
            System.err.println("Ошибка: " + e.getMessage());
        }
    }
}

Чтение файла

import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.io.IOException;
import java.util.List;

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

        try {
            // Чтение всех строк в список
            List<String> allLines = Files.readAllLines(path);
            System.out.println("Содержимое файла:");
            for (String line : allLines) {
                System.out.println(line);
            }

            // Чтение как одной строки
            String content = Files.readString(path);
            System.out.println("\nПолный текст:\n" + content);
        } catch (IOException e) {
            System.err.println("Ошибка чтения: " + e.getMessage());
        }
    }
}

Копирование и перемещение файлов

import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardCopyOption;
import java.io.IOException;

public class FileOperationsExample {
    public static void main(String[] args) {
        Path source = Paths.get("source.txt");
        Path target = Paths.get("backup/source_copy.txt");

        try {
            // Создаём директорию, если её нет
            Files.createDirectories(target.getParent());

            // Копирование с заменой существующего файла
            Files.copy(source, target, StandardCopyOption.REPLACE_EXISTING);
            System.out.println("Файл скопирован");

            // Перемещение (переименование)
            Path newLocation = Paths.get("new_location.txt");
            Files.move(source, newLocation, StandardCopyOption.REPLACE_EXISTING);
            System.out.println("Файл перемещён");

            // Удаление
            Files.deleteIfExists(newLocation);
            System.out.println("Файл удалён");
        } catch (IOException e) {
            System.err.println("Ошибка операции: " + e.getMessage());
        }
    }
}

4. Обход директорий и работа с фильтрами

NIO.2 предоставляет

Блоги

Рекомендаций по книгам