Класс Files в Java NIO
java.nio.file.Filesявляется служебным классом в пакете Java NIO (New I/O), расположенным вjava.nio.fileпакет.
java.nio.file.FilesОн предоставляет ряд статических методов для работы с файлами и каталогами в файловой системе, значительно упрощая операции файлового ввода-вывода.
Основные возможности
- Статические методы: Все методы статические, нет необходимости создавать экземпляр
- Богатая функциональность: предоставляет различные функции, такие как чтение/запись файлов, операции с атрибутами, обход каталогов и т. д.
- Обработка исключений: единообразно использует
IOExceptionдля обработки исключений файловых операций - Работает с Path: В основном используется с
java.nio.file.Pathinterface
Классификация общих методов
Примечание:Многие методы выбрасывают IOException, поэтому при их использовании требуется обработка исключений.
Ниже перечислены общие методы класса java.nio.file.Files:
1. Операции с файлами
Чтение/запись файлов
Пример
// Прочитать все строки файла
List<String> lines = Files.readAllLines(path);
// Записать в файл
Files.write(path, content.getBytes());
// Запись с добавлением
Files.write(path, content.getBytes(), StandardOpenOption.APPEND);
List<String> lines = Files.readAllLines(path);
// Записать в файл
Files.write(path, content.getBytes());
// Запись с добавлением
Files.write(path, content.getBytes(), StandardOpenOption.APPEND);
Копирование/перемещение/удаление файлов
Пример
// Копировать файл
Files.copy(sourcePath, targetPath);
// Переместить/переименовать файл
Files.move(sourcePath, targetPath);
// Удалить файл
Files.delete(path);
Files.copy(sourcePath, targetPath);
// Переместить/переименовать файл
Files.move(sourcePath, targetPath);
// Удалить файл
Files.delete(path);
2. Операции с каталогами
Создание каталогов
Пример
// Создать одноуровневый каталог
Files.createDirectory(path);
// Создать многоуровневый каталог
Files.createDirectories(path);
Files.createDirectory(path);
// Создать многоуровневый каталог
Files.createDirectories(path);
Обход каталогов
Пример
// Обойти каталог
try (Stream<Path> paths = Files.list(directoryPath)) {
paths.forEach(System.out::println);
}
// Рекурсивный обход каталога
try (Stream<Path> paths = Files.walk(directoryPath)) {
paths.forEach(System.out::println);
}
try (Stream<Path> paths = Files.list(directoryPath)) {
paths.forEach(System.out::println);
}
// Рекурсивный обход каталога
try (Stream<Path> paths = Files.walk(directoryPath)) {
paths.forEach(System.out::println);
}
3. Операции с атрибутами файлов
Получение атрибутов файла
Пример
// Проверка существования файла
boolean exists = Files.exists(path);
// Получение размера файла
long size = Files.size(path);
// Получение времени последнего изменения файла
FileTime lastModifiedTime = Files.getLastModifiedTime(path);
boolean exists = Files.exists(path);
// Получение размера файла
long size = Files.size(path);
// Получение времени последнего изменения файла
FileTime lastModifiedTime = Files.getLastModifiedTime(path);
Настройка атрибутов файла
Пример
// Установить время последнего изменения файла
Files.setLastModifiedTime(path, FileTime.fromMillis(System.currentTimeMillis()));
// Установить права доступа к файлу
Set<PosixFilePermission> perms = PosixFilePermissions.fromString("rwxr-x---");
Files.setPosixFilePermissions(path, perms);
Files.setLastModifiedTime(path, FileTime.fromMillis(System.currentTimeMillis()));
// Установить права доступа к файлу
Set<PosixFilePermission> perms = PosixFilePermissions.fromString("rwxr-x---");
Files.setPosixFilePermissions(path, perms);
Расширенные функции
1. Поиск файлов
Пример
// Найти файлы с определённым расширением
try (Stream<Path> paths = Files.find(
directoryPath,
Integer.MAX_VALUE,
(path, attrs) -> path.toString().endsWith(".txt"))) {
paths.forEach(System.out::println);
}
try (Stream<Path> paths = Files.find(
directoryPath,
Integer.MAX_VALUE,
(path, attrs) -> path.toString().endsWith(".txt"))) {
paths.forEach(System.out::println);
}
2. Операции с временными файлами
Пример
// Создать временный файл
Path tempFile = Files.createTempFile("prefix", ".suffix");
// Создать временный каталог
Path tempDir = Files.createTempDirectory("tempDir");
Path tempFile = Files.createTempFile("prefix", ".suffix");
// Создать временный каталог
Path tempDir = Files.createTempDirectory("tempDir");
3. Представления атрибутов файлов
Пример
// Получить владельца файла
UserPrincipal owner = Files.getOwner(path);
// Получить информацию о файловом хранилище
FileStore store = Files.getFileStore(path);
UserPrincipal owner = Files.getOwner(path);
// Получить информацию о файловом хранилище
FileStore store = Files.getFileStore(path);
Лучшие практики
1. Обработка исключений
Пример
try {
Files.copy(sourcePath, targetPath, StandardCopyOption.REPLACE_EXISTING);
} catch (IOException e) {
System.err.println("Не удалось выполнить операцию с файлом: " + e.getMessage());
}
Files.copy(sourcePath, targetPath, StandardCopyOption.REPLACE_EXISTING);
} catch (IOException e) {
System.err.println("Не удалось выполнить операцию с файлом: " + e.getMessage());
}
2. Освобождение ресурсов
Пример
try (Stream<String> lines = Files.lines(path)) {
lines.forEach(System.out::println);
} // Автоматически закрыть поток
lines.forEach(System.out::println);
} // Автоматически закрыть поток
3. Соображения производительности
- Для больших файлов используйте буферизованные потоки (
Files.newBufferedReader/Files.newBufferedWriter) - Для пакетных операций рассмотрите возможность использования
Files.walkвместо рекурсивных вызовов - Часто используемые атрибуты можно кэшировать
Сравнение с традиционным вводом-выводом
| Характеристика | Класс Files (NIO) | Традиционный ввод-вывод (java.io) |
|---|---|---|
| Тип метода | Статические методы | Методы экземпляра |
| Представление Path | Использует интерфейс Path | Использует класс File |
| Обработка исключений | Использует IOException единообразно | Несколько типов исключений |
| Богатство возможностей | Более богатая функциональность | Базовая функциональность |
| Обработка символических ссылок | Нативная поддержка | Ограниченная поддержка |
| Операции с атрибутами файлов | Более всесторонний | Ограниченно |
С помощьюFilesкласса, Java предоставляет более современный и мощный API для работы с файлами. Рекомендуется использовать его в новых проектах вместо традиционногоjava.io.Fileclass.