Класс 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:

Метод Описание
Операции с файлами
static Path copy(Path source, Path target, CopyOption... options) Копирует файл из исходного пути в целевой путь
static Path move(Path source, Path target, CopyOption... options) Перемещает или переименовывает файл
static void delete(Path path) Удаляет файл
static boolean deleteIfExists(Path path) Удаляет файл, если он существует
Атрибуты файла
static boolean exists(Path path, LinkOption... options) Проверяет, существует ли файл
static boolean isDirectory(Path path, LinkOption... options) Проверяет, является ли путь каталогом
static boolean isRegularFile(Path path, LinkOption... options) Проверяет, является ли путь обычным файлом
static boolean isReadable(Path path) Проверяет, доступен ли файл для чтения
static boolean isWritable(Path path) Проверяет, доступен ли файл для записи
static boolean isExecutable(Path path) Проверяет, является ли файл исполняемым
static long size(Path path) Возвращает размер файла (в байтах)
static FileTime getLastModifiedTime(Path path, LinkOption... options) Получает время последнего изменения файла
Операции с содержимым файла
static byte[] readAllBytes(Path path) Читает все байты файла
static List<String> readAllLines(Path path) Читает все строки файла
static List<String> readAllLines(Path path, Charset cs) Читает все строки файла с использованием указанной кодировки
static Stream<String> lines(Path path) Возвращает поток строк в файле
static Stream<String> lines(Path path, Charset cs) Возвращает поток строк в файле с использованием указанной кодировки
static Path write(Path path, byte[] bytes, OpenOption... options) Записывает байты в файл
static Path write(Path path, Iterable<? extends CharSequence> lines, OpenOption... options) Записывает текстовые строки в файл
Операции с каталогами
static Stream<Path> list(Path dir) Перечисляет записи в каталоге
static DirectoryStream<Path> newDirectoryStream(Path dir) Открывает поток каталога
static Path createDirectory(Path dir, FileAttribute<?>... attrs) Создаёт каталог
static Path createDirectories(Path dir, FileAttribute<?>... attrs) Создаёт каталог (включая все несуществующие родительские каталоги)
Временные файлы/каталоги
static Path createTempFile(Path dir, String prefix, String suffix, FileAttribute<?>... attrs) Создаёт временный файл
static Path createTempDirectory(Path dir, String prefix, FileAttribute<?>... attrs) Создаёт временный каталог
Другие
static Path createFile(Path path, FileAttribute<?>... attrs) Создаёт новый файл
static SeekableByteChannel newByteChannel(Path path, OpenOption... options) Открывает или создаёт файл, возвращая байтовый канал с поддержкой позиционирования
static InputStream newInputStream(Path path, OpenOption... options) Открывает входной поток файла
static OutputStream newOutputStream(Path path, OpenOption... options) Открывает поток вывода в файл
static BufferedReader newBufferedReader(Path path) Открывает буферизованный поток чтения
static BufferedWriter newBufferedWriter(Path path, OpenOption... options) Открывает буферизованный поток записи
static String probeContentType(Path path) Определяет тип содержимого файла

1. Операции с файлами

Чтение/запись файлов

Пример

// Прочитать все строки файла
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);

2. Операции с каталогами

Создание каталогов

Пример

// Создать одноуровневый каталог
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);
}

3. Операции с атрибутами файлов

Получение атрибутов файла

Пример

// Проверка существования файла
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);

Расширенные функции

1. Поиск файлов

Пример

// Найти файлы с определённым расширением
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");

3. Представления атрибутов файлов

Пример

// Получить владельца файла
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());
}

2. Освобождение ресурсов

Пример

try (Stream<String> lines = Files.lines(path)) {
    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.

Другие расширения