Новая библиотека ввода/вывода (NIO), представленная с помощью JDK 1.4, обеспечивает высокоскоростной блок-ориентированный ввод-вывод в стандартном Java-коде.
Несколько точек на NiO,
- НЛ поток ориентированной, где НИО является буфером ориентированным.
- Предложение операций ввода/вывода неблокирующая
- Избегайте дополнительную копию данных, передаваемых между Java и родной памяти
- позволяет читать и писать блоки данных непосредственно с диска, а не побайтно
API NIO вводит новую примитивную абстракцию ввода-вывода, называемую каналом. Канал представляет собой открытое соединение с объектом, таким как аппаратное устройство, файл, сетевой сокет. Когда вы используете APIs FileChannel.transferTo() или FileChannel.transferFrom() JVM использует доступ ОС к DMA (Прямой доступ к памяти), который является потенциальным преимуществом.
В соответствии с Ron Hitches
на Java NIO
Прямые буферы предназначены для взаимодействия с каналами и нативные подпрограммы ввода/вывода. Они прилагают максимум усилий для хранения элементов байта в области памяти , которую канал может использовать для прямого или необработанного доступа, используя собственный код , чтобы сообщить операционной системе, чтобы она могла непосредственно слить или заполнить область памяти .
Буферы с прямым байтом, как правило, являются лучшим выбором для операций ввода-вывода. По дизайну они поддерживают самый эффективный механизм ввода-вывода, доступный для JVM . Небезопасные байтовые буферы могут передаваться в каналы, но при этом может нести штраф за производительность. Как правило, небезопасный буфер не может быть объектом собственной операции ввода-вывода.
Прямые буферы оптимальны для ввода-вывода, но они могут быть более дорогими, чем создавать, чем небезопасные байтовые буферы. Память, используемая прямыми буферами , выделяется путем вызова собственного кода операционной системы , минуя стандартную кучу JVM. Настройка и отключение Прямые буферы могут быть значительно более дорогими, чем буферов-резидентных буферов, в зависимости от операционной системы хоста и реализации JVM . Области памяти для хранения прямых буферов не подлежат сбору мусора, потому что они находятся за пределами стандартной JVM кучи
Глава 2 на ниже учебник даст вам больше понимания (особенно 2.4, 2.4.2 и т.д.) http://blogimg.chinaunix.net/blog/upfile2/090901134800.pdf
http://stackoverflow.com/questions/5670862/bytebuffer-allocate-vs-bytebuffer-allocatedirect –