- PVSM.RU - https://www.pvsm.ru -
Этот пакет был добавлен еще в Java 1.4, однако многие разработчики о нем либо не знают, либо не умеют пользоваться. В сети мало материалов на эту тему, особенно на русском.
Java New IO — «новая» реализация IO. Ее предназначение — решить проблемы производительности стандартного блокирующего IO. Почти все методы чтения-записи без блокировок, они читают или записывают лишь уже доступную информацию. Это позволяет в одном или нескольких потоках обрабатывать любое количество подключений.
Продолжение под хабракатом
Более функциональная и удобная замена массивов. Используется для хранения считанной информации и в качестве источника для записи. Всего есть несколько типов буферов:
Помимо этого, можно создать ReadOnlyBuffer методом asReadOnly(); Каждый буфер имеет размер (capacity), лимит (limit), текущую позицию (position) и метку (mark):
Кроме этого, у каждого буфера есть пара методов, которые позволяют им управлять:
Создать буфер можно тоже разным способами:
Заместо Stream'ов, в NIO используются каналы (Channel), которые могут объеденять функциональность InputStream и OutputStream.
Сам по себе Channel имеет только методы close() и isOpen(). Остальные методы добавляются реализуемыми им интерфейсами:
Для удобного управления SelectableChannel есть специальный класс — Selector. Его можно использовать только после того, как Вы отключили блокировки (channel.configureBlocking(false));
Selector — своеобразный слушатель, который сообщает, когда с каналом можно совершить какое-то действие. Без него не получится сделать нормальное NIO приложение. Для начала его надо создать. Selector создается с статического метода Selector.open(). После создания селектора, необходимо его зарегестрировать на нужном канале. Это делается с помощью метода:
SelectionKey key = channel.register(selector, ops, [attach])
Selection Op определяет, какие события необходимо отслеживать:
OP'ы можно объеденять с помощью логического ИЛИ:
int ops = SelectionKey.OP_ACCEPT | SelectionKey.OP_READ;
SelectionKey — объект, который провоцирует событие. Имеет несколько полезных методов:
Чтобы обрабатывать каналы с Selector'ом, необходимо сделать цикл, который работает до закрытия канала. Пример приведени ниже:
while(!serverKey.isCancelled())
{
selector.select(); // Ждем до того, как появится хотя бы одно событие. Как появятся, выбираем ключи с этими событиями
Iterator<SelectionKey> iterator = selector.selectedKeys().iterator(); // Получаем итератор выбранных ключей
while(iterator.hasNext())
{
SelectionKey key = iterator.next();
SelectableChannel channel = key.channel();
if(key.isAcceptable())
{
// принимаем подключение у сервера. Тут же его регистрируем в селекторе с OP_READ.
}
if(key.isReadable())
{
// читаем данные, если длина -1, удаляем ключ с помощью key.cancel();
}
if(key.isWriteable())
{
// записываем данные
}
iterator.remove(); // Удаляем ключ из выбранных, так как мы его обработали
}
}
selector.close();
Это все, что нужно знать для начала работы с NIO. Вопросы задавайте в комментариях.
Автор: sashok724
Источник [1]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/java/40730
Ссылки в тексте:
[1] Источник: http://habrahabr.ru/post/189800/
Нажмите здесь для печати.