1. Основные понятия
IO - это процесс копирования данных с помощью основной памяти и внешних устройств (жесткие диски, терминалы, сети и т. Д.). IO является основной функциональной реализацией операционной системы, которая выполняется с помощью инструкций ввода/вывода.
Все системы выполнения языка предоставляют инструменты высокого уровня для выполнения ввода-вывода. (C Printfscanf, объектно-ориентированная инкапсуляция Java)
2. Обзор Java Standard IO
Библиотека Java Standard Class Class является абстракцией объектно-ориентированного ввода. Основываясь на базовой реализации местных методов, нам не нужно обращать внимание на основную реализацию. InputStream/outputStream: передавать один байт за раз. Читатель/писатель: один персонаж за раз.
3.nio введение
Nio является аббревиатурой Javanewio, нового API, предоставленного в JDK1.4. Характеристики, которые, официально утверждают Sun, заключаются в следующем:
Обеспечивает (буферный) поддержку кеша для всех примитивных типов.
Набор символов, кодирование и декодирование решений.
Канал: новая оригинальная абстракция ввода -вывода.
Поддерживает интерфейсы доступа к файлам для файлов блокировки и отображения памяти.
Обеспечивает неблокирующую, не блокирующую, высоко масштабируемую сеть ввода-вывода.
Эта статья изучит и представит эти функции.
4. Буффер и Шанель
Channel и Buffer являются NIO и являются двумя самыми основными абстракциями типа данных.
Буфер:
Это непрерывный блок памяти.
Это место транзита для чтения или написания данных NIO.
Канал:
Источник данных или назначения данных
Уникальный интерфейс для предоставления данных для буферов или данных буфера для чтения, буферных объектов.
Асинхронная поддержка ввода/вывода
Пример 1: copyfile.java:
Образец пакета; импорт java.io.fileinputstream; import java.io.fileoutputstream; import java.nio.bytebuffer; import java.nio.channels.fileChannel; открытый класс copyfile {public static void main (String [] args) throws exception {string infile = "c: //copy.sql"; "C: //copy.txt"; // Получить входные и выходные потоки исходных и целевых файлов fileInputStream = new FileInputStream (Infile); FileOutputStream fout = new FileOutputStream (Outfile); // Получить входные и выходные каналы fiLechannel fcin = fin.getCannel (); Buffer -buffer = FCOUT = fout.GetCannal (); Bytebuffer.allocate (1024); В то время как (true) {// Clear Method сбрасывает буфер, чтобы он мог принять Buffer Data Data. Прочтите данные в другой канал Buffer.flip (); // Записать данные из выходного канала в буфер fcout.write (buffer);}}}Внутренняя структура буфера заключается в следующем (следующее рисунок копируется из информации):
Рисунок 2: Внутренняя структура буфера
Буфер в основном контролирует процесс считывания и написания с помощью трех переменных, ограничения и емкости. Значение этих трех переменных показано в следующей таблице:
параметр | Письменная режим | Режим чтения |
позиция | Количество данных единиц, написанных в настоящее время. | Текущее местоположение данных с прочтением данных. |
предел | Он представляет максимальное количество единиц данных, а мощность, которые могут быть записаны, одинаково. | Он представляет максимальное количество единиц данных, которые могут быть прочитаны, что согласуется с объемом данных единицы, записанных ранее. |
емкость | Буферная емкость | Буферная емкость |
Общие методы буфера:
flip (): преобразовать режим записи в режим чтения
rewind (): сбросить положение до 0, обычно используемое для повторного чтения.
clear (): очистить буфер и подготовиться к написанию снова (позиция становится 0, предел становится емкостью).
Compact (): скопируйте непрочитанные данные в голову буфера.
mark (), reset (): mark может отметить позицию, сброс может быть сброшен в эту позицию.
Общие типы буфера: Bytebuffer, Mapedbytebuffer, Charbuffer, Doublebuffer, Floatbuffer, Intbuffer, Longbuffer, Shortbuffer.
Общие каналы: FileChannel, DatagramChannel (UDP), SocketchEnkenles (TCP), Serversocketchannel (TCP)
Простой тест на производительность была выполнена на этой машине. Мой ноутбук работает в меру. (См. Приложение для конкретного кода. См. Пример ниже в пакете nio.sample.filecopy) Ниже приведены эталонные данные:
Сценарий 1: скопируйте файл 370 м
Сценарий 2: три потока копируют одновременно, каждый поток копирует файл 370 м.
Сцена | FileInputStream+ FileOutputStream | FileInputStream+ BufferedInputStream+ FileOutputStream | Bytebuffer+ FileChannel | MAPEDBYTEBUFFER +FileChannel |
Сцена на время (миллисекунд) | 25155 | 17500 | 19000 | 16500 |
Сцена 2 раз (миллисекунд) | 69000 | 67031 | 74031 | 71016 |
5.nio.charset
Кодирование и декодирование символов: сам байт -код - это лишь некоторые числа, которые правильно проанализированы в правильном контексте. При хранении данных в Bytebuffer вам необходимо рассмотреть метод кодирования набора символов. При чтении и отображении данных Bytebuffer вы включаете декодирование набора символов.
Java.nio.charset предоставляет набор решений для кодирования и декодирования.
Принимая наш самый распространенный HTTP -запрос в качестве примера, запрос должен быть правильно закодирован при запросе. Ответ должен быть правильно декодирован, когда он получен.
Следующий код отправляет запрос на Baidu и получает результаты для отображения. Пример демонстрирует использование charset.
Пример 2baidureader.java
пакет nio.readpage; import java.nio.bytebuffer; import java.nio.channels.socketchannel; import java.nio.charset.charset; импорт java.net.inetsocketAddress; импорт java.io.ioexception; public class baidureader {private charset = charset.fornam Socketchannel Channel; public void readhtmlcontent () {try {inetSocketAddress socketAddress = new InetSocketCocketAddress ("www.baidu.com", 80); // step1: Откройте канал соединения = socketchannel.open (socketAddress); // step2: отправить запрос, encode.write (garse.ence. Http/1.1 " +"/r/n/r/n ")); // step3: прочитать данные Bytebuffer buffer = bytebuffer.allocate (1024); // Создать буфер 1024 -byte, в то время как (Channel.read (буфер)! System.out.println (charset.decode (buffer)); // Использовать метод charset.decode для преобразования байтов в строковый буфер. e) {}}}} public static void main (string [] args) {new baidureader (). readhtmlcontent ();}}6. Не блокирующий io
Что касается неблокирующего ввода-индикатора, мы поймем из аспектов того, что блокирует, что не блокирует, не блокирующий принцип и асинхронное ядро API.
Что такое блокировка?
Процесс общей сети ввода -вывода заключается в следующем:
Из этого сетевого процесса связи давайте поймем, что такое блокировка:
Если подключение не появилось в вышеуказанном процессе, то принять заблокируется, программа должна будет вешать после работы здесь, а ЦП вместо этого выполнит другие потоки.
Если данные не готовы в приведенном выше процессе, чтение также будет блокировать.
Особенности блокировки сети IO: многопоточное несколько подключений. Каждый поток имеет свое собственное место в стеке и занимает некоторое время процессора. Каждый поток будет блокироваться, когда он встречает внешнюю готовность. Результатом блокировки является то, что это приведет к большому количеству переключения контекста процесса. И большинство процесса переключения контекста может быть бессмысленным. Например, предположим, что поток слушает порт, и в день будет только несколько запросов, но процессор должен постоянно делать попытки переключения контекста для потока, а большая часть переключения заканчивается блокировкой.
Что не блокирует?
Вот метафора:
На автобусе от А до В на дороге есть много очков, которые могут выйти. Водитель не знает, какие очки выйдут из автобуса. Как справиться с теми, кому нужно лучше выйти из автобуса?
1. Во время процесса водитель регулярно спрашивает каждого пассажира, прибыл ли он в пункт назначения. Если кто -то это говорит, водитель останавливается, и пассажир выходит. (Подобно блокировке)
2. Все рассказывают продавцу билетов свой пункт назначения, а затем спит. Водитель взаимодействует только с продавцом билетов. Когда он прибудет в определенный момент, продавец билетов уведомит пассажира о том, чтобы он вышел из автобуса. (Подобно не блокировке)
Очевидно, что каждый, кто достигнет пункта назначения, можно считать потоком, а драйвер можно считать процессором. В стиле блокировки каждая нить должна постоянно опросить и переключать контекст, чтобы достичь результата поиска пункта назначения. В неблокирующем режиме каждый пассажир (нить) спит (спать) и просыпается только тогда, когда готова настоящая внешняя среда. Такой пробуждение определенно не будет блокировать.
Принцип не блокировки
Переключите весь процесс на небольшие задачи и выполните его посредством сотрудничества между задачами.
Выделенная нить обрабатывает все события IO и отвечает за распространение.
Механизм, управляемый событиями: триггеры, когда прибывает событие, а не мониторинг событий одновременно.
Связь с потоком: потоки общаются через ожидание, уведомление и другие средства. Убедитесь, что каждый контекст имеет смысл. Уменьшить ненужное переключение процесса.
Ниже приведена структура асинхронного IO:
Реактор является вышеуказанной метафорической ролью продавца билетов. Поток обработки каждого потока, вероятно, состоит в том, чтобы считывать данные, декодировать, вычислять обработку, кодировать и отправлять ответы.
Асинхронная ядро API ввода
Селектор
Основной класс асинхронного ввода -вывода, который может обнаружить события по одному или нескольким каналам и распространять события.
Используйте поток SELECT, чтобы прослушать события на нескольких каналах и запустить соответствующие ответы на основе драйверов событий. Нет необходимости выделять поток для каждого канала.
SelectionKey
Содержит привязку канала, соответствующую информации о состоянии события и времени.
Суммировать
Вышеупомянутое - все содержание этой статьи о основных эссе знаний Java, я надеюсь, что это будет полезно для всех. Заинтересованные друзья могут продолжать ссылаться на другие связанные темы на этом сайте. Если есть какие -либо недостатки, пожалуйста, оставьте сообщение, чтобы указать это. Спасибо, друзья, за вашу поддержку на этом сайте!