[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"question-i-o-nio-chto-takoe-nio-2-i-chem-on-otlichaetsya-ot-java-io-file":3},{"id":4,"slug":5,"topicId":6,"topicSlug":7,"topicName":8,"topicEmoji":9,"question":10,"answer":11,"codeLang":12,"codeSrc":12,"important":12,"commonMistakes":12,"modernUsage":12,"difficulty":13,"tags":14,"related":19,"progress":20,"seo":21},683,"chto-takoe-nio-2-i-chem-on-otlichaetsya-ot-java-io-file",15,"i-o-nio","I\u002FO & NIO","📁","Что такое NIO.2 и чем он отличается от java.io.File?","NIO.2 (пакет `java.nio.file`) — это API для работы с файловой системой, появившееся в Java 7 как замена устаревшему классу `java.io.File`. Центральные элементы — интерфейс `Path` и утилитный класс `Files`.\n\n### Path vs File\n\n`Path` — это интерфейс, представляющий путь в файловой системе. Объекты `Path` являются неизменяемыми (immutable), что обеспечивает потокобезопасность и предсказуемость.\n\n```java\n\u002F\u002F Старый подход — java.io.File\nFile file = new File(\"\u002Fhome\u002Fuser\u002Fdata.txt\");\n\n\u002F\u002F Новый подход — java.nio.file.Path\nPath path = Path.of(\"\u002Fhome\u002Fuser\u002Fdata.txt\");            \u002F\u002F Java 11+\nPath path2 = Paths.get(\"\u002Fhome\u002Fuser\u002Fdata.txt\");          \u002F\u002F Java 7+\nPath path3 = Path.of(\"\u002Fhome\", \"user\", \"data.txt\");      \u002F\u002F составной путь\n```\n\n### Основные отличия\n\n| Характеристика | java.io.File | java.nio.file.Path + Files |\n|---|---|---|\n| Тип | Класс | Path — интерфейс |\n| Иммутабельность | Нет | Да |\n| Обработка ошибок | Возвращает `false`\u002F`null` | Бросает информативные исключения (`NoSuchFileException`, `AccessDeniedException`) |\n| Символьные ссылки | Ограниченная поддержка | Полная поддержка |\n| Метаданные файлов | Ограниченный набор | Полный набор атрибутов через `Files.readAttributes()` |\n| Обход дерева | Ручная рекурсия | `Files.walk()`, `Files.walkFileTree()` |\n| Stream API | Нет | `Files.lines()`, `Files.list()`, `Files.walk()` |\n\n### Класс Files\n\n`Files` предоставляет статические методы для всех операций с файлами и каталогами.\n\n\u003Cdetails>\u003Csummary>Примеры работы с Files\u003C\u002Fsummary>\n\n```java\n\u002F\u002F Чтение и запись (Java 11+)\nString content = Files.readString(Path.of(\"file.txt\"));\nFiles.writeString(Path.of(\"output.txt\"), \"Содержимое\", StandardCharsets.UTF_8);\n\n\u002F\u002F Чтение и запись (Java 7+)\nbyte[] bytes = Files.readAllBytes(Path.of(\"file.txt\"));\nList\u003CString> lines = Files.readAllLines(Path.of(\"file.txt\"), StandardCharsets.UTF_8);\n\n\u002F\u002F Ленивое чтение строк (возвращает Stream)\ntry (Stream\u003CString> stream = Files.lines(Path.of(\"large_file.txt\"))) {\n    stream.filter(line -> line.contains(\"ERROR\"))\n          .forEach(System.out::println);\n}\n\n\u002F\u002F Обход дерева каталогов\ntry (Stream\u003CPath> paths = Files.walk(Path.of(\"\u002Fhome\u002Fuser\"))) {\n    paths.filter(Files::isRegularFile)\n         .filter(p -> p.toString().endsWith(\".java\"))\n         .forEach(System.out::println);\n}\n\n\u002F\u002F Копирование, перемещение, удаление\nFiles.copy(source, target, StandardCopyOption.REPLACE_EXISTING);\nFiles.move(source, target, StandardCopyOption.ATOMIC_MOVE);\nFiles.deleteIfExists(path);\n```\n\n\u003C\u002Fdetails>\n\n### Преобразование между File и Path\n\n```java\nFile file = new File(\"data.txt\");\nPath path = file.toPath();         \u002F\u002F File -> Path\n\nPath path2 = Path.of(\"data.txt\");\nFile file2 = path2.toFile();       \u002F\u002F Path -> File\n```\n\n### Частые ошибки\n\n- Забывают закрывать `Stream` от `Files.lines()` и `Files.walk()` — утечка файловых дескрипторов.\n- Используют `Files.readAllLines()` для огромных файлов — весь файл загружается в память.\n- Не указывают `StandardCopyOption.REPLACE_EXISTING` при копировании.\n- Путают `Files.delete()` (бросает исключение) и `Files.deleteIfExists()` (возвращает boolean).\n\n> **На собеседовании:** назовите ключевые преимущества NIO.2: иммутабельный Path, информативные исключения, полная поддержка символьных ссылок, интеграция со Stream API. Использование `java.io.File` в новом коде считается устаревшей практикой.","","middle",[15,16,17,18],"core","file","nio","io",[],null,{"title":22,"description":23,"ogTitle":24,"ogDescription":25,"keywords":26,"schemaAnswer":38,"featuredSnippetReady":39},"NIO.2 (Path, Files) vs java.io.File — Gymterview","NIO.2: интерфейс Path, класс Files. Отличия от File: иммутабельность, информативные исключения, символьные ссылки, Stream API, walkFileTree.","NIO.2 vs java.io.File — что выбрать — Gymterview","Сравнение NIO.2 (Path, Files) и java.io.File: иммутабельность, исключения, символьные ссылки, Stream API.",[27,28,29,30,31,32,33,34,35,36,37],"NIO.2","Path","Files","java.io.File","java.nio.file","иммутабельный","walkFileTree","readString","writeString","Java 7","собеседование","NIO.2 (java.nio.file, Java 7+) — API для файловой системы с интерфейсом Path и утилитным классом Files. Отличия от File: Path иммутабелен, Files бросает информативные исключения (вместо boolean\u002Fnull), полная поддержка символьных ссылок, интеграция со Stream API (lines, walk, list), readString\u002FwriteString (Java 11+). File считается устаревшим подходом.",true]