---
title: IO и NIO
seo:
  title: IO и NIO — Java Developer
  description: Тема «IO и NIO» для собеседования Java Developer. В чём заключается разница между IO и NIO? Какие особенности NIO вы знаете?
---

[Все темы Java Developer](/java-developer)

## <strong>В чём заключается разница между</strong> <code>IO</code> <strong>и</strong> <code>NIO</code><strong>?</strong> [#q-14bee738d69b81fab691c6c5befda7f5]

Основные различия между <code>IO</code> (Input/Output) и <code>NIO</code> (New Input/Output) в Java кратко можно сформулировать следующим образом&#58;

{/* prettier-ignore */}
1. <strong>Модель</strong>&#58;

    - <strong>IO</strong>&#58; Основана на блокирующих операциях ввода-вывода. Каждый поток обрабатывает одно соединение или операцию ввода-вывода.

    - NIO использует каналы и буферы. SelectableChannel может работать в блокирующем или неблокирующем режиме; Selector сообщает готовность каналов. Асинхронные каналы относятся к отдельному API NIO.2. Неблокирующий и асинхронный ввод-вывод не тождественны.

1. <strong>Каналы и селекторы</strong>&#58;

    - <strong>IO</strong>&#58; Работает с потоками ввода-вывода (<code>InputStream</code>, <code>OutputStream</code>), которые обычно блокируются в ожидании данных.

    - <strong>NIO</strong>&#58; Использует каналы (<code>Channel</code>) для обмена данными и селекторы (<code>Selector</code>), позволяющие одному потоку обрабатывать несколько каналов, опрашивая их на доступные данные или готовность к записи.

1. <strong>Буферы</strong>&#58;

    - <strong>IO</strong>&#58; Ввод и вывод осуществляются напрямую через потоки данных.

    - <strong>NIO</strong>&#58; Использует буферы (<code>Buffer</code>), которые служат промежуточным хранилищем данных перед их фактической записью или чтением.

1. <strong>Эффективность</strong>&#58;

    - <strong>IO</strong>&#58; Может быть менее эффективным при большом количестве одновременных соединений из-за блокировок и потребления ресурсов потоков.

    - <strong>NIO</strong>&#58; Предлагает более высокую эффективность и масштабируемость благодаря возможности асинхронной обработки и меньшему числу потоков.

1. <strong>Поддержка</strong>&#58;

    - <strong>IO</strong>&#58; Поддерживается в Java с момента ее появления и используется в старых API, таких как <code>java&#46;io</code>.

    - <strong>NIO</strong>&#58; Введена в Java 1.4 и представляет собой новый API в <code>java&#46;nio</code>, предназначенный для более эффективной работы с сетевыми приложениями.

:::note[Ссылки для изучения]

1. [IO vs NIO. Java](https://javarush.com/quests/lectures/jru.module1.lecture41)
   :::

---

## <strong>Какие особенности</strong> <code>NIO</code> <strong>вы знаете?</strong> [#q-14bee738d69b812ba9bac9940ef5e1bd]

Основные особенности <code>NIO</code> в Java&#58;

1. <strong>Неблокирующий ввод-вывод</strong>&#58; Позволяет выполнять операции
   ввода-вывода без блокировки потоков.

1. <strong>Каналы и буферы</strong>&#58; Использует каналы (<code>Channel</code>
   ) для передачи данных и буферы (<code>Buffer</code>) для их временного
   хранения.

1. <strong>Селекторы</strong>&#58; Позволяет одному потоку управлять несколькими
   каналами, улучшая масштабируемость.

1. <strong>Мемори-маппинг</strong>&#58; Поддержка памяти, отображенной в файл (
   <code>MappedByteBuffer</code>), для более быстрой работы с файлами.

1. <strong>Асинхронные операции</strong>&#58; Поддержка асинхронного
   ввода-вывода для улучшения производительности.

1. <strong>Наборы ключей</strong>&#58; Использование <code>SelectionKey</code>
   для управления состоянием каналов.

:::note[Ссылки для изучения]

1. [IO vs NIO. Java](https://javarush.com/quests/lectures/jru.module1.lecture41)
   :::
