[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"question-i-o-nio-v-chyom-zaklyuchaetsya-raznitsa-mezhdu-io-i-nio":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},655,"v-chyom-zaklyuchaetsya-raznitsa-mezhdu-io-i-nio",15,"i-o-nio","I\u002FO & NIO","📁","В чём заключается разница между IO и NIO?","Java IO (Input\u002FOutput) и Java NIO (New I\u002FO, также расшифровывается как Non-blocking I\u002FO) представляют два подхода к операциям ввода\u002Fвывода, различающихся по ориентации на данные, модели блокировки и масштабируемости.\n\n> Аналогия из жизни: IO — это чтение книги строго по порядку, страница за страницей, без возможности вернуться назад. NIO — это работа с блокнотом, где можно в любой момент перелистнуть на нужную страницу, делать закладки и обрабатывать несколько блокнотов одновременно.\n\n### Потокоориентированность vs буфер-ориентированность\n\nJava IO является потокоориентированным: данные читаются или записываются последовательно, байт за байтом (или символ за символом). Прочитанные данные нигде не кэшируются, и вернуться назад по потоку нельзя. Java NIO работает с буферами: данные сначала считываются в буфер (`ByteBuffer`), а затем обрабатываются. Это даёт гибкость — можно перемещаться по буферу вперёд и назад, перечитывать данные.\n\n### Блокирующий vs неблокирующий режим\n\nПотоки IO являются блокирующими: вызов `read()` или `write()` блокирует поток выполнения до завершения операции. В NIO каналы могут работать в неблокирующем режиме: поток выполнения запрашивает данные и получает то, что доступно на данный момент (или ничего), и может продолжать другую работу.\n\n### Селекторы\n\nВ NIO существуют селекторы (`Selector`), позволяющие одному потоку выполнения мониторить несколько каналов ввода\u002Fвывода. Это ключевое преимущество для сетевых приложений, обслуживающих тысячи соединений.\n\n| Характеристика | IO | NIO |\n|---|---|---|\n| Ориентация | Потоки (stream) | Буферы (buffer) |\n| Блокировка | Блокирующий | Неблокирующий (опционально) |\n| Модель | Один поток на соединение | Один поток на множество каналов |\n| Обратное перемещение | Невозможно | Возможно (в буфере) |\n| Основные классы | InputStream, OutputStream | Channel, Buffer, Selector |\n\n### Когда что использовать\n\n- IO подходит для простых задач: чтение конфигурации, запись логов, обработка небольших файлов.\n- NIO подходит для высоконагруженных сетевых приложений и работы с большими файлами, где важна эффективность и масштабируемость.\n\n> **На собеседовании:** ключевые отличия — потоковая vs буферная модель, блокирующий vs неблокирующий режим, и наличие селекторов в NIO. Частая ошибка — говорить, что NIO всегда лучше IO. На практике для простого файлового ввода\u002Fвывода IO (или NIO.2 Files API) проще и достаточен.","","junior",[15,16,17,18],"core","основы","nio","io",[],null,{"title":22,"description":23,"ogTitle":24,"ogDescription":25,"keywords":26,"schemaAnswer":36,"featuredSnippetReady":37},"В чём разница между IO и NIO в Java — Gymterview","Разбираем отличия Java IO и NIO: потоковая vs буферная модель, блокирующий vs неблокирующий режим, селекторы. Подготовка к собеседованию Java Developer.","Разница между IO и NIO в Java — Gymterview","Потоковая vs буферная модель, блокирующий vs неблокирующий ввод\u002Fвывод, селекторы NIO. Сравнительная таблица и рекомендации.",[27,28,29,30,31,32,33,34,35],"Java IO","Java NIO","InputStream","ByteBuffer","Channel","Selector","блокирующий ввод-вывод","неблокирующий","собеседование","Java IO — потокоориентированный и блокирующий ввод\u002Fвывод (InputStream\u002FOutputStream). Java NIO — буфер-ориентированный с возможностью неблокирующего режима (Channel, ByteBuffer, Selector). IO читает\u002Fпишет побайтно, NIO работает с буферами. NIO поддерживает селекторы для мониторинга нескольких каналов одним потоком.",true]