Jakie są przykładowe aplikacje dla ByteBuffer
Java? Proszę wymienić wszystkie przykładowe scenariusze, w których jest to używane. Dziękuję Ci!
Jakie są przykładowe aplikacje dla ByteBuffer
Java? Proszę wymienić wszystkie przykładowe scenariusze, w których jest to używane. Dziękuję Ci!
Odpowiedzi:
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.
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
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.
ByteBuffer
należ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.
Oto świetny artykuł wyjaśniający zalety ByteBuffer. Oto kluczowe punkty tego artykułu:
Poniżej przedstawiono korzyści specjalnie dla bezpośrednich ByteBuffer / MappedByteBuffer. Zauważ, że bezpośrednie bufory są tworzone poza stertą:
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.
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.