Работа с файловой системой в 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