Які приклади програм для ByteBuffer
Java? Перерахуйте будь-який приклад сценаріїв, де це використовується. Дякую!
Які приклади програм для ByteBuffer
Java? Перерахуйте будь-який приклад сценаріїв, де це використовується. Дякую!
Відповіді:
Це хороший опис його використання та недоліків. Ви по суті використовуєте його, коли вам потрібно робити швидкі низькорівневі введення / виведення. Якщо ви збиралися реалізувати протокол TCP / IP або якщо ви писали базу даних (СУБД), цей клас стане у нагоді.
Клас ByteBuffer важливий, оскільки він є основою для використання каналів на Java. Клас ByteBuffer визначає шість категорій операцій над байтовими буферами, як зазначено в документації Java 7 :
Абсолютні та відносні способи отримання та введення, які читають і записують по одному байту;
Відносна маса отримує методи, які передають суміжні послідовності байтів з цього буфера в масив;
Відносна об'ємна маса розміщує методи, що передають суміжні послідовності байтів з байтового масиву або якогось іншого байтового буфера в цей буфер;
Абсолютні та відносні способи отримання та розміщення методів, які читають і записують значення інших примітивних типів, переводячи їх у послідовності байтів і з них у певному порядку байтів;
Методи створення буферів перегляду, які дозволяють байтовому буфері розглядатися як буфер, що містить значення деякого іншого примітивного типу; і
Методи ущільнення , дублювання та нарізки байтового буфера.
Example code : Putting Bytes into a buffer.
// Create an empty ByteBuffer with a 10 byte capacity
ByteBuffer bbuf = ByteBuffer.allocate(10);
// Get the buffer's capacity
int capacity = bbuf.capacity(); // 10
// Use the absolute put(int, byte).
// This method does not affect the position.
bbuf.put(0, (byte)0xFF); // position=0
// Set the position
bbuf.position(5);
// Use the relative put(byte)
bbuf.put((byte)0xFF);
// Get the new position
int pos = bbuf.position(); // 6
// Get remaining byte count
int rem = bbuf.remaining(); // 4
// Set the limit
bbuf.limit(7); // remaining=1
// This convenience method sets the position to 0
bbuf.rewind(); // remaining=7
Java IO з використанням потокових орієнтованих API виконується з використанням буфера як тимчасового зберігання даних у просторі користувача. Дані, зчитувані з диска за допомогою DMA, спочатку копіюються в буфери в просторі ядра, а потім передаються в буфер у користувальницькому просторі. Звідси є накладні витрати. Якщо уникнути цього, можна досягти значного збільшення продуктивності.
Ми могли б пропустити цей тимчасовий буфер у просторі користувача, якби був спосіб безпосередньо отримати доступ до буфера в просторі ядра. Java NIO надає спосіб зробити це.
ByteBuffer
входить до декількох буферів, наданих Java NIO. Це просто контейнер або тримаючи резервуар для читання даних або запису даних до них. Вищенаведена поведінка досягається шляхом виділення прямого буфера за допомогою allocateDirect()
API на буфер.
В Android ви можете створювати спільний буфер між C ++ та Java (методом directAlloc) та маніпулювати ним в обидві сторони.
Ось чудова стаття, що пояснює переваги ByteBuffer. Нижче наведено ключові моменти статті:
Нижче перераховані переваги спеціально для прямого ByteBuffer / MappedByteBuffer. Зауважте, що прямі буфери створюються поза купою:
Не впливає циклів gc : прямі буфери не переміщуватимуться під час циклів збору сміття, оскільки вони знаходяться поза купою. Технологія кешування BigMemory TerraCota, схоже, сильно покладається на цю перевагу. Якби вони були на купі, це сповільнить час паузи в gc.
Підвищення продуктивності : У потоці IO читання викликів спричинить за собою системні виклики, для яких потрібен контекстний перехід між користувачем у режим ядра та навпаки, що було б дорого, особливо якщо файл постійно отримує доступ. Однак із відображенням пам’яті ця комутація контексту зменшується, оскільки дані, швидше за все, знаходяться в пам’яті (MappedByteBuffer). Якщо дані доступні в пам'яті, доступ до них здійснюється безпосередньо без виклику ОС, тобто без переключення контексту.
Зауважте, що MappedByteBuffers дуже корисні, особливо якщо файли великі, а до кількох груп блоків звертаються частіше.