Was sind Beispielanwendungen für a ByteBuffer
in Java? Bitte listen Sie alle Beispielszenarien auf, in denen dies verwendet wird. Danke dir!
java
buffer
bytebuffer
Aklin
quelle
quelle
Antworten:
Dies ist eine gute Beschreibung seiner Verwendungen und Mängel. Sie verwenden es im Wesentlichen immer dann, wenn Sie schnelle Low-Level-E / A ausführen müssen. Wenn Sie ein TCP / IP-Protokoll implementieren oder eine Datenbank (DBMS) schreiben würden, wäre diese Klasse nützlich.
quelle
Die ByteBuffer-Klasse ist wichtig, da sie eine Grundlage für die Verwendung von Kanälen in Java bildet. Die ByteBuffer- Klasse definiert sechs Kategorien von Operationen für Bytepuffer , wie in der Java 7-Dokumentation angegeben :
Example code : Putting Bytes into a buffer.
quelle
Java IO unter Verwendung von Stream-orientierten APIs wird unter Verwendung eines Puffers als temporäre Speicherung von Daten im Benutzerbereich ausgeführt. Von DMA von der Festplatte gelesene Daten werden zuerst in Puffer im Kernelraum kopiert, die dann in den Puffer im Benutzerraum übertragen werden. Daher gibt es Overhead. Wenn Sie dies vermeiden, können Sie einen erheblichen Leistungsgewinn erzielen.
Wir könnten diesen temporären Puffer im Benutzerbereich überspringen, wenn es eine Möglichkeit gäbe, direkt auf den Puffer im Kernelbereich zuzugreifen. Java NIO bietet eine Möglichkeit, dies zu tun.
ByteBuffer
gehört zu mehreren von Java NIO bereitgestellten Puffern. Es ist nur ein Container oder ein Vorratsbehälter zum Lesen oder Schreiben von Daten. Das obige Verhalten wird durch Zuweisen eines direkten Puffers mithilfe derallocateDirect()
API für den Puffer erreicht.Die Java-Dokumentation des Bytepuffers enthält nützliche Informationen.
quelle
In Android können Sie einen gemeinsamen Puffer zwischen C ++ und Java (mit der directAlloc-Methode) erstellen und auf beiden Seiten bearbeiten.
quelle
Hier ist ein großartiger Artikel, der die Vorteile von ByteBuffer erklärt. Im Folgenden sind die wichtigsten Punkte des Artikels aufgeführt:
Im Folgenden finden Sie Vorteile speziell für direkten ByteBuffer / MappedByteBuffer. Beachten Sie, dass direkte Puffer außerhalb des Heapspeichers erstellt werden:
Von GC-Zyklen nicht betroffen : Direkte Puffer werden während der Speicherbereinigungszyklen nicht verschoben, da sie sich außerhalb des Heaps befinden. Die BigMemory- Caching-Technologie von TerraCota scheint stark von diesem Vorteil abhängig zu sein . Wenn sie auf einem Haufen wären, würde dies die Pausenzeiten verlangsamen.
Leistungssteigerung : In Stream-E / A würden Leseaufrufe Systemaufrufe beinhalten, die einen Kontextwechsel zwischen Benutzer in den Kernelmodus und umgekehrt erfordern, was insbesondere dann kostspielig wäre, wenn ständig auf Dateien zugegriffen wird. Mit der Speicherzuordnung wird diese Kontextumschaltung jedoch reduziert, da Daten eher im Speicher gefunden werden (MappedByteBuffer). Wenn Daten im Speicher verfügbar sind, wird direkt auf sie zugegriffen, ohne das Betriebssystem aufzurufen, dh ohne Kontextwechsel.
Beachten Sie, dass MappedByteBuffers sehr nützlich sind, insbesondere wenn die Dateien groß sind und nur wenige Gruppen von Blöcken häufiger aufgerufen werden.
quelle