Java NIO против ввода-вывода
Как мы знаем, Java NIO вводится для улучшения обычного Java IO API. Основные улучшения, которые делают NIO более эффективным, чем IO, - это модель потока данных канала, используемая в NIO, и использование операционной системы для обычных задач ввода-вывода.
Разницу между Java NIO и Java IO можно объяснить следующим образом:
Как упоминалось в предыдущем посте в буфере NIO и ориентированном на канал потоке данных для операций ввода-вывода, которые обеспечивают более быстрое выполнение и лучшую производительность по сравнению с вводом-выводом. Также NIO использует операционную систему для обычных задач ввода-вывода, что снова делает его более эффективным.
Другой аспект различия между NIO и IO заключается в том, что этот ввод-вывод использует поток данных строки потока, то есть по одному байту за раз, и полагается на преобразование объектов данных в байты и наоборот, в то время как NIO имеет дело с блоками данных, которые представляют собой блоки байтов.
В java объекты потока ввода-вывода являются однонаправленными, в то время как в NIO каналы являются двунаправленными, что означает, что канал может использоваться как для чтения, так и для записи данных.
Оптимизация потока данных в IO не позволяет перемещаться вперед и назад в данных. В случае необходимости перемещаться вперед и назад в данных, считанных из потока, необходимо сначала кэшировать их в буфере. В то время как в случае NIO мы используем ориентированный на буфер что позволяет получать доступ к данным туда и обратно без необходимости кеширования.
NIO API также поддерживает многопоточность, так что данные могут считываться и записываться асинхронно, например, при выполнении операций ввода-вывода текущий поток не блокируется. Это снова делает его более эффективным, чем обычный API ввода-вывода Java.
Концепция многопоточности вводится с введением Selectors в java NIO, которые позволяют прослушивать несколько каналов для событий ввода-вывода асинхронным или неблокирующим способом.
Многопоточность в NIO делает его неблокирующим, что означает, что поток запрашивается для чтения или записи только тогда, когда данные доступны, в противном случае поток может использоваться в другой задаче в течение некоторого времени. Но это невозможно в случае обычного ввода-вывода Java, поскольку нет многопоточности в нем поддерживается, что делает его блокирующим.
NIO позволяет управлять несколькими каналами, используя только один поток, но стоимость состоит в том, что синтаксический анализ данных может быть несколько сложнее, чем при чтении данных из блокирующего потока в случае Java IO, поэтому в случае, если требуется меньше соединений с очень высокой пропускной способностью с отправкой большого количества данных за раз, чем в этом случае лучше всего подходит Java IO API.