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