Работа с файлами
Современный 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). Текст переведён и переработан, примеры кода написаны заново.