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

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

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

Начать курс

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

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

Основы работы с файлами в Java: класс File

Класс java.io.File — это краеугольный камень работы с файловой системой в Java. Он представляет собой абстрактное представление пути к файлу или каталогу. Важно понимать, что File не хранит содержимое файла, а лишь предоставляет методы для проверки свойств и выполнения операций.

Рассмотрим базовые операции с File:

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

public class FileExample {
    public static void main(String[] args) {
        // Создание объекта File
        File file = new File("example.txt");
        File directory = new File("myDirectory");

        // Проверка существования
        System.out.println("Файл существует: " + file.exists());
        System.out.println("Папка существует: " + directory.exists());

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

        // Создание каталога
        if (directory.mkdir()) {
            System.out.println("Папка создана: " + directory.getName());
        }

        // Получение информации о файле
        System.out.println("Абсолютный путь: " + file.getAbsolutePath());
        System.out.println("Размер файла: " + file.length() + " байт");
        System.out.println("Читаемый: " + file.canRead());
        System.out.println("Записываемый: " + file.canWrite());

        // Удаление файла
        if (file.delete()) {
            System.out.println("Файл удален");
        }
    }
}

Класс File также позволяет работать со списками файлов в каталоге:

File currentDir = new File(".");
String[] contents = currentDir.list();
for (String item : contents) {
    System.out.println(item);
}

Чтение и запись файлов: потоки ввода-вывода

Для непосредственной работы с содержимым файлов Java использует потоки ввода-вывода (I/O streams). Основные классы для работы с текстовыми файлами — FileReader/FileWriter и BufferedReader/BufferedWriter.

Чтение файла построчно

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

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

Обратите внимание на конструкцию try-with-resources. Она автоматически закрывает поток, что предотвращает утечку ресурсов.

Запись в файл

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

public class WriteFileExample {
    public static void main(String[] args) {
        String fileName = "output.txt";
        String content = "Это текст для записи в файл.\nВторая строка.";

        try (BufferedWriter writer = new BufferedWriter(new FileWriter(fileName))) {
            writer.write(content);
            System.out.println("Текст записан в файл: " + fileName);
        } catch (IOException e) {
            System.err.println("Ошибка записи: " + e.getMessage());
        }
    }
}

Для работы с бинарными файлами используйте FileInputStream и FileOutputStream.

Современный подход: пакет java.nio.file

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

Создание и проверка путей

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

public class NioExample {
    public static void main(String[] args) {
        // Создание пути
        Path path = Paths.get("documents", "report.txt");
        System.out.println("Путь: " + path);
        System.out.println("Имя файла: " + path.getFileName());
        System.out.println("Родительский каталог: " + path.getParent());

        // Проверка существования
        System.out.println("Существует: " + Files.exists(path));

        // Создание файла
        try {
            Path newFile = Files.createFile(Paths.get("newfile.txt"));
            System.out.println("Создан файл: " + newFile);
        } catch (IOException e) {
            System.err.println("Ошибка: " + e.getMessage());
        }
    }
}

Чтение и запись с помощью Files

Класс Files предоставляет статические методы для всех основных операций:

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 FilesReadWriteExample {
    public static void main(String[] args) {
        Path filePath = Paths.get("data.txt");

        // Запись строк в файл
        List<String> lines = List.of("Первая строка", "Вторая строка", "Третья строка");
        try {
            Files.write(filePath, lines);
            System.out.println("Данные записаны");
        } catch (IOException e) {
            System.err.println("Ошибка записи: " + e.getMessage());
        }

        // Чтение всех строк из файла
        try {
            List<String> readLines = Files.readAllLines(filePath);
            System.out.println("Содержимое файла:");
            for (String line : readLines) {
                System.out.println(line);
            }
        } catch (IOException e) {
            System.err.println("Ошибка чтения: " + e.getMessage());
        }

        // Копирование файла
        Path destPath = Paths.get("backup_data.txt");
        try {
            Files.copy(filePath, destPath);
            System.out.println("Файл скопирован");
        } catch (IOException e) {
            System.err.println("Ошибка копирования: " + e.getMessage());
        }
    }
}

Работа с каталогами

import java                

Блоги

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