Jakie jest zastosowanie ByteBuffer w Javie? [Zamknięte]


199

Jakie są przykładowe aplikacje dla ByteBufferJava? Proszę wymienić wszystkie przykładowe scenariusze, w których jest to używane. Dziękuję Ci!


1
Kompresja Apache Hadoop (na przykład kodek Zlib) korzysta z ByteBuffer z jave.nio.
nikk

Dobry do wysyłania danych do GPU.
Pixel

Odpowiedzi:


138

Jest to dobry opis jego zastosowań i wad. Zasadniczo korzystasz z niego, ilekroć potrzebujesz szybkiego We / Wy niskiego poziomu. Jeśli zamierzasz wdrożyć protokół TCP / IP lub piszesz bazę danych (DBMS), ta klasa byłaby przydatna.


3
Czy jest przydatny w witrynie o dużym natężeniu ruchu opracowanej przy użyciu Java i Cassandra DB?
Aklin 30.01.11

1
Po szybkim wyszukiwaniu wydaje się, że tak, Cassandra używa ByteBuffer: mail-archive.com/commits@cassandra.apache.org/msg14967.html Jeśli zastanawiasz się nad surową witryną, może być, ale zazwyczaj jest to tylko będą używane przez strony internetowe pośrednio - za pomocą narzędzi takich jak
Cassandra

1
niezły link, dzięki. chciałbym dodać ten, który uznałem za
Peter Perháč

Zły link, obawiam się ...
RoyalBigMack

96

Klasa ByteBuffer jest ważna, ponieważ stanowi podstawę do korzystania z kanałów w Javie. Klasa ByteBuffer definiuje sześć kategorii operacji na buforach bajtów, zgodnie z dokumentacją Java 7 :

  • Bezwzględne i względne metody get i put , które odczytują i zapisują pojedyncze bajty;

  • Względne zbiorcze metody pobierania , które przenoszą ciągłe sekwencje bajtów z tego bufora do tablicy;

  • Względne metody wprowadzania zbiorczego , które przenoszą ciągłe sekwencje 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 pierwotnych typów, tłumacząc je na i z sekwencji bajtów w określonej kolejności bajtów;

  • Metody tworzenia buforów widoku, które umożliwiają wyświetlanie bufora bajtów jako bufora zawierającego wartości niektórych innych typów pierwotnych; i

  • Metody kompaktowania , powielania i dzielenia bufora bajtów.

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
większość tego komentarza została skopiowana z java 7 docs .
Janus Troelsen,

6
Chyba, że ​​korzystasz z nieoczywistego efektu ubocznego, wierzę, że możesz użyć niewłaściwej metody do absolutnego wprowadzenia. Javadoc wydaje się wskazywać, że bezwzględne wprowadzenie wymaga wartości indeksu.
Chuck Wolber

6
nawet jeśli jest to tylko kopia api doc, to nawet wbrew jego wynikowi, niektórzy ludzie wydają się zbyt leniwi, aby na to spojrzeć.
Chris

1
W jednym z przykładów jest błąd. „Absolutne wprowadzenie” pomija pierwszy parametr reprezentujący indeks (w tym przypadku 0).
bvdb

21

Java IO korzystające z interfejsów API zorientowanych na strumień jest wykonywane 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 narzut. Unikanie tego może osiągnąć znaczny wzrost wydajności.

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

ByteBuffernależy do kilku buforów udostępnianych przez Java NIO. To tylko pojemnik lub zbiornik do przechowywania danych do odczytu lub zapisu danych. Powyższe zachowanie uzyskuje się przez przydzielenie bufora bezpośredniego za pomocą allocateDirect()interfejsu API w buforze.

Dokumentacja Java Byte Buffer zawiera przydatne informacje.


14

W Androidzie możesz utworzyć wspólny bufor między C ++ i Javą (metodą directAlloc) i manipulować nim po obu stronach.


13

Oto świetny artykuł wyjaśniający zalety ByteBuffer. Oto kluczowe punkty tego artykułu:

  • Pierwszą zaletą ByteBuffer, niezależnie od tego, czy jest to bezpośredni czy pośredni, jest efektywny losowy dostęp do strukturalnych danych binarnych (np. IO niskiego poziomu, jak podano w jednej z odpowiedzi). Przed Javą 1.4 do odczytu takich danych można było użyć DataInputStream, ale bez losowego dostępu.

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

  1. Nie dotyczy cyklów gc : bufory bezpośrednie nie zostaną przeniesione podczas cykli wyrzucania elementów bezużytecznych, ponieważ znajdują się poza stertą. Wydaje się, że technologia buforowania BigMemory firmy TerraCota opiera się na tej przewadze. Gdyby były na stosie, spowolniłoby to czasy pauzy.

  2. Zwiększenie wydajności : w strumieniu We / Wy wywołania odczytu pociągałyby za sobą wywołania systemowe, które wymagają przełączania kontekstu między trybem użytkownika a trybem jądra i odwrotnie, co byłoby kosztowne, zwłaszcza jeśli plik byłby 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, można uzyskać do nich bezpośredni dostęp bez wywoływania systemu operacyjnego, tj. Bez przełączania kontekstu.

Zauważ, że MappedByteBuffers są bardzo przydatne, szczególnie jeśli pliki są duże i dostęp do kilku grup bloków jest uzyskiwany częściej.

  1. Udostępnianie stron : Pliki odwzorowane w pamięci mogą być współużytkowane między procesami, ponieważ są przydzielane w przestrzeni pamięci wirtualnej procesu i mogą być współużytkowane przez procesy.
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.