Работа с файлами

Современный Java I/O предлагает два пути работы с файлами:

  • Старый API — класс java.io.File (с JDK 1.0). Простой, но ограниченный.

  • NIO.2 — пакет java.nio.file (с JDK 7): классы Path, Paths, Files. Богаче по возможностям, лучше работает с символическими ссылками, атрибутами и большими файлами.

Files содержит десятки статических методов: чтение/запись текста и байтов целиком, копирование, перемещение, удаление, проверка существования, обход директорий. Для небольших файлов (например, конфиги AlashEd или логи датчиков) одни-два вызова Files.readAllLines / Files.writeString полностью покрывают задачу.

Синтаксис

import java.nio.file.*;

Path p = Paths.get("sensors.log");          // Path-объект
boolean exists = Files.exists(p);
List<String> lines = Files.readAllLines(p); // весь файл в память
Files.writeString(p, "новое содержимое");   // запись (перезапись)

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

import java.io.IOException;
import java.nio.file.*;
import java.util.List;

public class WriteRead {
    public static void main(String[] args) throws IOException {
        Path p = Paths.get("readings.txt");
        Files.writeString(p, "22.5\n23.1\n21.8\n");

        List<String> lines = Files.readAllLines(p);
        for (String line : lines) {
            System.out.println("[" + line + "]");
        }
    }
}

Output:

[22.5]
[23.1]
[21.8]

Пример 2. Проверка существования и удаление

import java.io.IOException;
import java.nio.file.*;

public class FileOps {
    public static void main(String[] args) throws IOException {
        Path p = Paths.get("temp.log");
        Files.writeString(p, "temporary");

        System.out.println("Существует: " + Files.exists(p));
        System.out.println("Размер:     " + Files.size(p) + " байт");

        Files.delete(p);
        System.out.println("После удаления: " + Files.exists(p));
    }
}

Output:

Существует: true
Размер:     9 байт
После удаления: false

Пример 3. Добавление в файл

import java.io.IOException;
import java.nio.file.*;

public class AppendDemo {
    public static void main(String[] args) throws IOException {
        Path log = Paths.get("sensors.log");
        Files.writeString(log, "start\n",
                StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING);
        Files.writeString(log, "DHT22 t=22.5\n", StandardOpenOption.APPEND);
        Files.writeString(log, "DHT22 t=22.7\n", StandardOpenOption.APPEND);

        Files.readAllLines(log).forEach(System.out::println);
    }
}

Output:

start
DHT22 t=22.5
DHT22 t=22.7

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

import java.io.IOException;
import java.nio.file.*;

public class CopyMove {
    public static void main(String[] args) throws IOException {
        Path src = Paths.get("config.ini");
        Files.writeString(src, "pin=13\n");

        Path copy = Paths.get("config.bak");
        Files.copy(src, copy, StandardCopyOption.REPLACE_EXISTING);

        Path moved = Paths.get("config.archive");
        Files.move(copy, moved, StandardCopyOption.REPLACE_EXISTING);

        System.out.println("src    : " + Files.exists(src));
        System.out.println("copy   : " + Files.exists(copy));
        System.out.println("moved  : " + Files.exists(moved));

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

Output:

src    : true
copy   : false
moved  : true

Пример 5. Чтение файла построчно (для больших файлов)

import java.io.IOException;
import java.nio.file.*;
import java.util.stream.Stream;

public class StreamLines {
    public static void main(String[] args) throws IOException {
        Path p = Paths.get("big.log");
        Files.writeString(p, "a\nb\nc\nd\n");

        try (Stream<String> lines = Files.lines(p)) {
            lines.filter(l -> !l.isEmpty())
                 .forEach(l -> System.out.println(">>" + l));
        }
        Files.delete(p);
    }
}

Output:

>>a
>>b
>>c
>>d

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

import java.io.IOException;
import java.nio.file.*;
import java.nio.file.attribute.BasicFileAttributes;

public class AttrDemo {
    public static void main(String[] args) throws IOException {
        Path p = Paths.get("info.txt");
        Files.writeString(p, "demo");

        BasicFileAttributes a = Files.readAttributes(p, BasicFileAttributes.class);
        System.out.println("Создан:    " + a.creationTime());
        System.out.println("Изменён:   " + a.lastModifiedTime());
        System.out.println("Размер:    " + a.size());
        System.out.println("Директория? " + a.isDirectory());

        Files.delete(p);
    }
}

Output (значения времени отличаются):

Создан:    2026-05-15T10:00:00Z
Изменён:   2026-05-15T10:00:00Z
Размер:    4
Директория? false

Подводные камни

Предупреждение

  • ``Files.readAllLines`` загружает файл целиком — для больших файлов используйте Files.lines со Stream и закрывайте его через try-with-resources.

  • Windows и Unix-пути различаются — используйте Path вместо строковой склейки.

  • ``Files.delete`` бросает исключение, если файла нет — используйте deleteIfExists.

  • По умолчанию запись использует UTF-8 (с JDK 18). На старых JDK уточняйте Charset.

  • ``Files.lines`` возвращает ленивый Stream — обязательно закрывайте его.

См. также

Примечание

Материал подготовлен на основе официальной документации Oracle Java Tutorials — File I/O (Featuring NIO.2) (Oracle Free Documentation License). Текст переведён и переработан, примеры кода написаны заново.