[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"question-i-o-nio-kak-realizovat-chtenie-bolshogo-fayla-bez-zagruzki-v-pamyat":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},686,"kak-realizovat-chtenie-bolshogo-fayla-bez-zagruzki-v-pamyat",15,"i-o-nio","I\u002FO & NIO","📁","Как реализовать чтение большого файла без загрузки в память?","При работе с большими файлами (сотни мегабайт и более) важно не загружать всё содержимое в оперативную память, используя потоковое (ленивое) чтение.\n\n### Подходы для текстовых файлов\n\nFiles.lines() — возвращает ленивый `Stream\u003CString>`, читающий строки по мере потребления:\n\n```java\ntry (Stream\u003CString> lines = Files.lines(Path.of(\"huge.txt\"), StandardCharsets.UTF_8)) {\n    long errors = lines.filter(l -> l.contains(\"ERROR\")).count();\n}\n```\n\nBufferedReader — классический подход с полным контролем:\n\n```java\ntry (BufferedReader reader = Files.newBufferedReader(Path.of(\"huge.txt\"))) {\n    String line;\n    while ((line = reader.readLine()) != null) {\n        \u002F\u002F обработка строки\n    }\n}\n```\n\n### Подходы для бинарных файлов\n\nFileChannel + ByteBuffer — эффективное чтение блоками:\n\n```java\ntry (FileChannel channel = FileChannel.open(Path.of(\"huge.bin\"),\n        StandardOpenOption.READ)) {\n    ByteBuffer buffer = ByteBuffer.allocateDirect(8192);\n    while (channel.read(buffer) != -1) {\n        buffer.flip();\n        while (buffer.hasRemaining()) { buffer.get(); }\n        buffer.clear();\n    }\n}\n```\n\nMappedByteBuffer — файл отображается в виртуальную память, ОС подгружает страницы по мере обращения:\n\n\u003Cdetails>\u003Csummary>Пример memory-mapped чтения\u003C\u002Fsummary>\n\n```java\ntry (FileChannel channel = FileChannel.open(Path.of(\"huge.dat\"),\n        StandardOpenOption.READ)) {\n    long fileSize = channel.size();\n    \u002F\u002F Для файлов > 2 ГБ — чтение по частям\n    long position = 0;\n    int chunkSize = 256 * 1024 * 1024; \u002F\u002F 256 МБ\n    while (position \u003C fileSize) {\n        long remaining = fileSize - position;\n        int mapSize = (int) Math.min(chunkSize, remaining);\n        MappedByteBuffer buffer = channel.map(\n            FileChannel.MapMode.READ_ONLY, position, mapSize);\n        while (buffer.hasRemaining()) { buffer.get(); }\n        position += mapSize;\n    }\n}\n```\n\n\u003C\u002Fdetails>\n\n### Сравнение подходов\n\n| Подход | Тип данных | Память | Скорость | Удобство |\n|---|---|---|---|---|\n| `Files.lines()` | Текст | Низкая | Средняя | Высокое |\n| `BufferedReader` | Текст | Низкая | Средняя | Среднее |\n| `FileChannel + ByteBuffer` | Бинарные | Низкая (размер буфера) | Высокая | Низкое |\n| `MappedByteBuffer` | Бинарные | Управляется ОС | Очень высокая | Среднее |\n\n### Частые ошибки\n\n- Используют `Files.readAllBytes()` или `Files.readAllLines()` для больших файлов — `OutOfMemoryError`.\n- Забывают закрывать `Stream\u003CString>` от `Files.lines()` — утечка файловых дескрипторов.\n- Применяют `MappedByteBuffer` для мелких файлов — накладные расходы перевешивают выгоду.\n- Для файлов больше 2 ГБ `MappedByteBuffer` нужно создавать по частям, так как `map()` принимает `int size`.\n\n> **На собеседовании:** назовите `Files.lines()` для текста и `FileChannel + ByteBuffer` для бинарных данных как основные подходы. Покажите понимание того, что ленивость Stream означает чтение по мере потребления, а не загрузку всего файла.","","middle",[15,16,17,18],"core","performance","nio","io",[],null,{"title":22,"description":23,"ogTitle":24,"ogDescription":25,"keywords":26,"schemaAnswer":37,"featuredSnippetReady":38},"Чтение большого файла без загрузки в память — Gymterview","Подходы к чтению больших файлов: Files.lines(), BufferedReader, FileChannel + ByteBuffer, MappedByteBuffer. Сравнение по памяти и скорости.","Чтение большого файла без загрузки в память Java — Gymterview","Files.lines(), BufferedReader, FileChannel + ByteBuffer, MappedByteBuffer: потоковое чтение больших файлов без OutOfMemoryError.",[27,28,29,30,31,32,33,34,35,36],"большой файл","Files.lines","BufferedReader","FileChannel","ByteBuffer","MappedByteBuffer","memory-mapped","OutOfMemoryError","потоковое чтение","собеседование","Текстовые файлы: Files.lines() — ленивый Stream\u003CString>, BufferedReader.readLine() — классический подход. Бинарные: FileChannel + ByteBuffer — чтение блоками, MappedByteBuffer — отображение в виртуальную память (ОС управляет подгрузкой страниц). Нельзя использовать readAllBytes()\u002FreadAllLines() — приводит к OutOfMemoryError. Для файлов >2 ГБ MappedByteBuffer создаётся по частям.",true]