Jaki jest użytek ByteBuffer w Javie? [zamknięte]

Zamknięte . To pytanie musi być bardziej skoncentrowane . Obecnie nie przyjmuje odpowiedzi.

Chcesz poprawić to pytanie? Update the question so it edytując ten post.

Zamknięte 6 lat temu .

Popraw to pytanie

Jakie są przykładowe aplikacje dla ByteBuffer w Javie? Proszę podać przykładowe scenariusze, w których jest to używane. Dziękuję!

Author: Shilad Sen, 2011-01-30

5 answers

Ten jest dobrym opisem jego zastosowań i niedociągnięć. Zasadniczo używasz go zawsze, gdy potrzebujesz wykonać szybkie niskopoziomowe we/wy. jeśli zamierzasz zaimplementować protokół TCP/IP lub piszesz bazę danych (DBMS), ta klasa byłaby przydatna.

 146
Author: kelloti,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-07-07 14:59:55

Klasa ByteBuffer jest ważna, ponieważ stanowi podstawę do używania kanałów w Javie. Klasa ByteBuffer definiuje sześć kategorii operacji na buforach bajtów, Jak podano w dokumentacji Java 7 :

  • Absolute and relative get and put methods that read and write single bajts;

  • Relative bulk get metody, które przenoszą ciągi bajtów z tego bufora do array;

  • Relative bulk put metody, które przenoszą ciągi bajtów z tablicy bajtów lub innego bufora bajtów do tego bufora;

  • Bezwzględne i względne metody get I put, które odczytują i zapisują wartości innych prymitywnych typów, tłumacząc je na i z sekwencji bajty w określonej kolejności bajtów;

  • Metody tworzenia buforów widoku, które pozwalają na przeglądanie bufora bajtowego jako bufora zawierającego wartości innego prymitywnego typu; i

  • Metody zagęszczania , powielanie i wycinanie bufora bajtowego.

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
 99
Author: ykombinator,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-11 20:28:43

Java IO przy użyciu API zorientowanych strumieniowo jest wykonywana przy użyciu bufora jako tymczasowego przechowywania danych w przestrzeni użytkownika. Dane odczytywane z dysku przez DMA są najpierw kopiowane do buforów w przestrzeni jądra, a następnie przesyłane do bufora w przestrzeni użytkownika. Stąd jest nad głową. Unikanie go może osiągnąć znaczny wzrost wydajności.

Moglibyśmy pominąć ten tymczasowy bufor w przestrzeni użytkownika, gdyby istniała możliwość bezpośredniego dostępu do bufora w przestrzeni jądra. Java NIO zapewnia na to sposób.

ByteBuffer jest jednym z kilku buforów dostarczanych przez Java NIO. To tylko pojemnik lub zbiornik do odczytu danych lub zapisu danych. Powyższe zachowanie uzyskuje się poprzez przydzielenie bezpośredniego bufora za pomocą allocateDirect() API na buforze.

Dokumentacja Java bufora bajtowego zawiera przydatne informacje.

 23
Author: deepujain,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-03 09:22:54

W Androidzie można utworzyć współdzielony bufor pomiędzy C++ i Javą (za pomocą metody directAlloc) i manipulować nim po obu stronach.

 15
Author: someUser,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-07-22 12:08:46

Tutaj {[2] } jest świetny artykuł wyjaśniający korzyści ByteBuffer. Poniżej znajdują się kluczowe punkty w artykule:

  • pierwszą zaletą bufora bajtowego, niezależnie od tego, czy jest on bezpośredni czy pośredni, jest efektywny dostęp losowy uporządkowanych danych binarnych(np. niskopoziomowe IO, jak podano w jednej z odpowiedzi). Przed wersją Java 1.4, do odczytu takich danych można było użyć strumienia danych, ale bez dostępu losowego.

Poniżej znajdują się korzyści specjalnie dla bezpośrednich ByteBuffer / MappedByteBuffer. Zauważ, że bufory bezpośrednie są tworzone poza stertą:

  1. Bez wpływu na cykle gc: bufory bezpośrednie nie będą przesuwane podczas cykli zbierania śmieci, ponieważ znajdują się poza stertą. Technologia buforowania TerraCota BigMemory wydaje się w dużym stopniu polegać na tej przewadze. Gdyby były na stercie, spowolniłoby to czasy pauzy gc.

  2. Zwiększenie wydajności: w stream IO wywołania odczytu pociągałyby za sobą wywołania systemowe, które wymaga przełączania kontekstu między trybem użytkownika na tryb jądra i odwrotnie, co byłoby kosztowne, zwłaszcza jeśli plik jest stale dostępny. Jednak w przypadku mapowania pamięci to przełączanie kontekstu jest zmniejszone, ponieważ dane są bardziej prawdopodobne w pamięci (MappedByteBuffer). Jeśli dane są dostępne w pamięci, są dostępne bezpośrednio bez wywoływania systemu operacyjnego, tzn. bez przełączania kontekstu.

Zauważ, że Mappedbytebuffery są bardzo przydatne, zwłaszcza jeśli pliki są duże i kilka grup bloków są dostępne częściej.

  1. dzielenie stron : Pliki mapowane w pamięci mogą być współdzielone między procesami, ponieważ są one przydzielane w wirtualnej przestrzeni pamięci procesu i mogą być współdzielone między procesami.
 13
Author: Dheeru Mundluru,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-11-01 10:50:19