Files

Files — статический утилитный класс из пакета java.nio.file, который пришёл на смену устаревшим java.io.File-операциям. Все методы — статические и принимают объекты Path, описывающие путь в файловой системе.

В Files собраны почти все операции, которые нужны при работе с файлами и каталогами: чтение, запись, копирование, перемещение, удаление, обход дерева, получение атрибутов, потоковый доступ к строкам.

Зачем нужен

  • Однострочные операции над файлами: прочитать как строку, записать список строк, скопировать.

  • Удобный обход каталогов без ручного рекурсивного кода.

  • Современный API, работающий с большими файлами, ссылками, атрибутами и кодировками.

Получение Path

  • Path.of("data", "log.txt").

  • Path.of("/tmp/log.txt").

  • Paths.get(...) — устаревший псевдоним.

Популярные методы

  • exists(Path) / notExists(Path) / isDirectory(Path) / isRegularFile(Path).

  • createFile(Path) / createDirectory(Path) / createDirectories(Path).

  • readString(Path) / writeString(Path, CharSequence, OpenOption...) — текст целиком.

  • readAllLines(Path) / write(Path, Iterable<? extends CharSequence>) — список строк.

  • readAllBytes(Path) / write(Path, byte[]) — бинарные данные.

  • copy(Path src, Path dst, CopyOption...), move(Path src, Path dst, CopyOption...).

  • delete(Path) / deleteIfExists(Path).

  • size(Path), getLastModifiedTime(Path).

  • list(Path), walk(Path) — потоки путей в каталоге и в дереве.

  • lines(Path) — поток строк (ленивое чтение).

Пример 1. Запись и чтение текста

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

public class TextIO {
    public static void main(String[] args) throws IOException {
        Path p = Path.of("note.txt");
        Files.writeString(p, "AlashEd Wiki\nJava notes");

        String content = Files.readString(p);
        System.out.println(content);

        Files.delete(p);
    }
}

Вывод:

AlashEd Wiki
Java notes

Пример 2. Чтение по строкам

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.List;

public class ReadLines {
    public static void main(String[] args) throws IOException {
        Path p = Path.of("kits.txt");
        Files.write(p, List.of("Arduino", "ESP32", "Robot Phobo"));

        List<String> lines = Files.readAllLines(p);
        for (int i = 0; i < lines.size(); i++) {
            System.out.println((i + 1) + ". " + lines.get(i));
        }
        Files.delete(p);
    }
}

Вывод:

1. Arduino
2. ESP32
3. Robot Phobo

Пример 3. Дозапись в файл

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

public class AppendDemo {
    public static void main(String[] args) throws IOException {
        Path log = Path.of("events.log");
        Files.writeString(log, "boot\n");
        Files.writeString(log, "sensor_ok\n", StandardOpenOption.APPEND);
        Files.writeString(log, "ready\n",     StandardOpenOption.APPEND);

        System.out.println(Files.readString(log));
        Files.delete(log);
    }
}

Вывод:

boot
sensor_ok
ready

Пример 4. Создание каталогов

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

public class MkDirs {
    public static void main(String[] args) throws IOException {
        Path dir = Path.of("tmp_demo", "logs", "2026");
        Files.createDirectories(dir);
        System.out.println("Существует: " + Files.isDirectory(dir));

        Files.delete(dir);
        Files.delete(dir.getParent());
        Files.delete(dir.getParent().getParent());
    }
}

Вывод:

Существует: true

Пример 5. Копирование и перемещение

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

public class CopyMove {
    public static void main(String[] args) throws IOException {
        Path src = Path.of("a.txt");
        Path dst = Path.of("b.txt");
        Path moved = Path.of("c.txt");

        Files.writeString(src, "hello");
        Files.copy(src, dst, StandardCopyOption.REPLACE_EXISTING);
        Files.move(dst, moved, StandardCopyOption.REPLACE_EXISTING);

        System.out.println("a: " + Files.exists(src));
        System.out.println("b: " + Files.exists(dst));
        System.out.println("c: " + Files.exists(moved) + " content=" + Files.readString(moved));

        Files.delete(src);
        Files.delete(moved);
    }
}

Вывод:

a: true
b: false
c: true content=hello

Пример 6. Атрибуты файла

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

public class Attrs {
    public static void main(String[] args) throws IOException {
        Path p = Path.of("attr.txt");
        Files.writeString(p, "12345");
        System.out.println("Размер: " + Files.size(p) + " байт");
        System.out.println("Файл?   " + Files.isRegularFile(p));
        System.out.println("Изменён:" + Files.getLastModifiedTime(p));
        Files.delete(p);
    }
}

Вывод (время зависит от системы):

Размер: 5 байт
Файл?   true
Изменён:2026-05-15T14:32:08Z

Пример 7. Список содержимого каталога

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.stream.Stream;

public class ListDir {
    public static void main(String[] args) throws IOException {
        Path dir = Path.of("demo_dir");
        Files.createDirectories(dir);
        Files.writeString(dir.resolve("a.txt"), "1");
        Files.writeString(dir.resolve("b.txt"), "2");

        try (Stream<Path> s = Files.list(dir)) {
            s.sorted().forEach(System.out::println);
        }

        Files.delete(dir.resolve("a.txt"));
        Files.delete(dir.resolve("b.txt"));
        Files.delete(dir);
    }
}

Вывод:

demo_dir/a.txt
demo_dir/b.txt

Пример 8. Потоковая обработка больших файлов

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.List;
import java.util.stream.Stream;

public class StreamLines {
    public static void main(String[] args) throws IOException {
        Path p = Path.of("nums.txt");
        Files.write(p, List.of("10", "20", "30", "40", "50"));

        long sum;
        try (Stream<String> lines = Files.lines(p)) {
            sum = lines.mapToInt(Integer::parseInt).sum();
        }
        System.out.println("Сумма: " + sum);
        Files.delete(p);
    }
}

Вывод:

Сумма: 150

См. также

Примечание

Описание основано на официальной документации Oracle Java SE 21 API (https://docs.oracle.com/en/java/javase/21/docs/api/). Материал распространяется на условиях Oracle Free Documentation License. Тексты статьи написаны редакцией AlashEd своими словами; примеры кода — авторские.