Как мы знаем, 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.