Учебники

Java NIO против IO

Как мы знаем, Java NIO введен для усовершенствования традиционного API Java IO. Основными усовершенствованиями, которые делают NIO более эффективным, чем IO, являются модель потока данных канала, используемая в NIO, и использование операционной системы для обычных задач ввода-вывода.

Разницу между Java NIO и Java IO можно объяснить следующим образом:

Как упоминалось в предыдущем посте, в буфере NIO и канально-ориентированном потоке данных для операций ввода / вывода, которые обеспечивают более быстрое выполнение и лучшую производительность по сравнению с IO. Также NIO использует операционную систему для обычных задач ввода / вывода, что снова делает ее более эффективной.

Другой аспект различия между NIO и IO состоит в том, что этот IO использует поток данных линии потока, то есть еще один байт за раз, и полагается на преобразование объектов данных в байты и наоборот, в то время как NIO работает с блоками данных, которые являются кусками байтов.

В Java потоковые объекты ввода / вывода являются однонаправленными, в то время как в NIO каналы являются двунаправленными, то есть канал может использоваться как для чтения, так и для записи данных.

Потоковый поток данных в IO не позволяет перемещаться вперед и назад в данных. В случае необходимости перемещаться вперед и назад в данных, считанных из потока, необходимо сначала кэшировать их в буфере. В случае NIO мы используем ориентированный на буфер что позволяет получать доступ к данным взад и вперед без необходимости кэширования.

NIO API также поддерживает многопоточность, так что данные могут считываться и записываться асинхронно, таким образом, чтобы при выполнении операций ввода-вывода текущий поток не блокировался. Это снова делает его более эффективным, чем обычный API ввода-вывода Java.

Концепция многопоточности вводится с введением селекторов в Java NIO, которые позволяют прослушивать несколько каналов для событий ввода-вывода асинхронным или неблокирующим способом.

Многопоточность в NIO делает его неблокирующим, что означает, что поток запрашивается для чтения или записи только при наличии данных, в противном случае поток можно использовать в другой задаче на время. Но это невозможно в случае обычного ввода-вывода Java, так как нет многопоточности поддерживается в нем, что делает его как блокирующий.

NIO позволяет управлять несколькими каналами, используя только один поток, но стоимость состоит в том, что синтаксический анализ данных может быть несколько более сложным, чем при чтении данных из блокирующего потока в случае Java-ввода-вывода. Так что в случае, если требуется меньше соединений с очень высокой пропускной способностью с отправкой большого количества данных за один раз, тогда в этом случае лучше всего подойдет java IO API.