Jaki jest użytek ByteBuffer w Javie? [zamknięte]
Chcesz poprawić to pytanie? Update the question so it edytując ten post.
Zamknięte 6 lat temu .
Popraw to pytanieJakie są przykładowe aplikacje dla ByteBuffer
w Javie? Proszę podać przykładowe scenariusze, w których jest to używane. Dziękuję!
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.
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
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.
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.
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
- 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ą:
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.
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.
- 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.
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