Яке використання ByteBuffer на Java? [зачинено]


199

Які приклади програм для ByteBufferJava? Перерахуйте будь-який приклад сценаріїв, де це використовується. Дякую!


1
Стиснення Apache Hadoop (наприклад, кодек zlib) використовує ByteBuffer від jave.nio.
nikk

Добре підходить для надсилання даних до GPU.
Піксель

Відповіді:


138

Це хороший опис його використання та недоліків. Ви по суті використовуєте його, коли вам потрібно робити швидкі низькорівневі введення / виведення. Якщо ви збиралися реалізувати протокол TCP / IP або якщо ви писали базу даних (СУБД), цей клас стане у нагоді.


3
Чи корисно де-небудь на веб-сайті з високим рівнем трафіку, розробленому за допомогою Java & Cassandra DB?
Аклін

1
Після швидкого пошуку виявляється, що так, Кассандра дійсно використовує ByteBuffer: mail-archive.com/commits@cassandra.apache.org/msg14967.html Якщо вам цікаво про сирий веб-сайт, це може бути, але зазвичай це лише буде використовуватися веб-сайтами опосередковано - використовуючи такі інструменти, як cassandra
kelloti

1
не погана посилання, дякую. я хотів би додати цю, яку я вважаю
Пітер Перхач

Погане посилання я боюся ...
RoyalBigMack

96

Клас 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

56
основна частина цього коментаря скопійована з java 7 docs .
Янус Троельсен

6
Якщо ви не скористаєтесь очевидним побічним ефектом, я вважаю, що ви можете використовувати неправильний метод для абсолютного набору. Здається, Javadoc вказує, що абсолютний пут вимагає значення індексу.
Чак Волбер

6
навіть якщо це просто копія api doc, навіть рівномірний її оцінка, деякі люди здаються занадто ледачими, щоб поглянути на це.
Кріс

1
В одному з прикладів є помилка. «Абсолютний пут» пропускає перший параметр, який представляє індекс (0 у цьому випадку).
bvdb

21

Java IO з використанням потокових орієнтованих API виконується з використанням буфера як тимчасового зберігання даних у просторі користувача. Дані, зчитувані з диска за допомогою DMA, спочатку копіюються в буфери в просторі ядра, а потім передаються в буфер у користувальницькому просторі. Звідси є накладні витрати. Якщо уникнути цього, можна досягти значного збільшення продуктивності.

Ми могли б пропустити цей тимчасовий буфер у просторі користувача, якби був спосіб безпосередньо отримати доступ до буфера в просторі ядра. Java NIO надає спосіб зробити це.

ByteBufferвходить до декількох буферів, наданих Java NIO. Це просто контейнер або тримаючи резервуар для читання даних або запису даних до них. Вищенаведена поведінка досягається шляхом виділення прямого буфера за допомогою allocateDirect()API на буфер.

Документація Java Bute Buffer містить корисну інформацію.


14

В Android ви можете створювати спільний буфер між C ++ та Java (методом directAlloc) та маніпулювати ним в обидві сторони.


13

Ось чудова стаття, що пояснює переваги ByteBuffer. Нижче наведено ключові моменти статті:

  • Перша перевага ByteBuffer незалежно від того, прямий він чи непрямий - це ефективний випадковий доступ до структурованих бінарних даних (наприклад, низькорівневий IO, як зазначено в одній з відповідей). До Java 1.4 для читання таких даних можна було використовувати DataInputStream, але без випадкового доступу.

Нижче перераховані переваги спеціально для прямого ByteBuffer / MappedByteBuffer. Зауважте, що прямі буфери створюються поза купою:

  1. Не впливає циклів gc : прямі буфери не переміщуватимуться під час циклів збору сміття, оскільки вони знаходяться поза купою. Технологія кешування BigMemory TerraCota, схоже, сильно покладається на цю перевагу. Якби вони були на купі, це сповільнить час паузи в gc.

  2. Підвищення продуктивності : У потоці IO читання викликів спричинить за собою системні виклики, для яких потрібен контекстний перехід між користувачем у режим ядра та навпаки, що було б дорого, особливо якщо файл постійно отримує доступ. Однак із відображенням пам’яті ця комутація контексту зменшується, оскільки дані, швидше за все, знаходяться в пам’яті (MappedByteBuffer). Якщо дані доступні в пам'яті, доступ до них здійснюється безпосередньо без виклику ОС, тобто без переключення контексту.

Зауважте, що MappedByteBuffers дуже корисні, особливо якщо файли великі, а до кількох груп блоків звертаються частіше.

  1. Обмін сторінками : Файли, відображені в пам'яті, можуть ділитися між процесами, оскільки вони розподіляються у віртуальному просторі пам’яті та можуть бути спільними для всіх процесів.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.