Was ist die Verwendung von ByteBuffer in Java? [closed]

Lesezeit: 5 Minuten

Benutzer-Avatar
Aklin

Was sind Anwendungsbeispiele für a ByteBuffer auf Java? Bitte listen Sie alle Beispielszenarien auf, in denen dies verwendet wird.

  • Die Komprimierung von Apache Hadoop (zlib-Codec zum Beispiel) verwendet ByteBuffer von jave.nio.

    – nick

    14. Juni 2016 um 14:23 Uhr


  • Gut zum Senden von Daten an GPUs.

    Benutzer1300214

    25. September 2019 um 16:59 Uhr


  • StackOverFlow: “Diese Frage ist nicht sinnvoll und daher geschlossen”. Ich: UpVote

    – Mohammad Elsayed

    29. März 2021 um 22:39 Uhr

Benutzer-Avatar
kelloti

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 praktisch.

  • Ist es in einer stark frequentierten Website nützlich, die mit Java & Cassandra DB entwickelt wurde?

    – Aklin

    30. Januar 2011 um 5:38 Uhr

  • Nach einer kurzen Suche scheint Cassandra ByteBuffer zu verwenden: mail-archive.com/[email protected]/msg14967.html Wenn Sie sich über eine rohe Website wundern, könnte es eine geben, aber normalerweise wird sie von Websites nur indirekt verwendet – durch die Verwendung von Tools wie cassandra

    – kelloti

    30. Januar 2011 um 5:48 Uhr


  • Kein schlechter Link, danke. möchte dieses hinzufügen, das ich nützlich fand – worldmodscode.wordpress.com/2012/12/14/…

    – Peter Perhač

    10. Mai 2016 um 8:27 Uhr

  • Schlechter Link, fürchte ich…

    – RoyalBigMack

    14. Juni 2020 um 16:11 Uhr

Benutzer-Avatar
ykombinator

Die Klasse ByteBuffer ist wichtig, weil sie eine Grundlage für die Verwendung von Kanälen in Java bildet. BytePuffer Klasse definiert sechs Kategorien von Operationen auf Byte-Puffer, wie in der Java 7-Dokumentation angegeben:

  • Absolut und relativ erhalten und stellen Methoden, die einzelne Bytes lesen und schreiben;

  • Relativ Masse bekommen Methoden, die zusammenhängende Folgen von Bytes aus diesem Puffer in ein Array übertragen;

  • Relativ Masse legen Methoden, die zusammenhängende Folgen von Bytes von einem Byte-Array oder einem anderen Byte-Puffer in diesen Puffer übertragen;

  • Absolute und relative Get- und Put-Methoden, die Werte anderer primitiver Typen lesen und schreiben und sie in und aus Bytefolgen in einer bestimmten Bytereihenfolge übersetzen;

  • Methoden zum Erstellen von Ansichtspuffern, die es ermöglichen, einen Bytepuffer als einen Puffer anzusehen, der Werte eines anderen primitiven Typs enthält; und

  • Methoden für Verdichtung, duplizierenund schneiden ein Bytepuffer.

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

  • Der Großteil dieses Kommentars wird aus dem kopiert Java 7-Dokumente.

    – Janus Troelsen

    19. Januar 2013 um 2:00 Uhr

  • Wenn Sie nicht eine nicht offensichtliche Nebenwirkung ausnutzen, glaube ich, dass Sie möglicherweise die falsche Methode für den absoluten Put verwenden. Das Javadoc scheint darauf hinzudeuten, dass absolute Put einen Indexwert erfordert.

    – Chuck Wolber

    12. November 2013 um 21:21 Uhr

  • Auch wenn es nur eine Kopie des API-Dokuments ist, ist es seine Punktzahl wert, da einige Leute zu faul zu sein scheinen, einen Blick darauf zu werfen.

    – Chris

    10. Februar 2014 um 16:23 Uhr

  • In einem der Beispiele ist ein Fehler. Beim “absoluten Put” fehlt der erste Parameter, der den Index darstellt (in diesem Fall 0).

    – bvdb

    26. Januar 2015 um 13:49 Uhr

Benutzer-Avatar
deepujain

Java IO unter Verwendung von Stream-orientierten APIs wird unter Verwendung eines Puffers als temporäre Speicherung von Daten innerhalb des Benutzerbereichs ausgeführt. Daten, die per DMA von der Platte gelesen werden, werden zuerst in Puffer im Kernel-Space kopiert, die dann in den Puffer im User-Space übertragen werden. Daher gibt es Overhead. Durch die Vermeidung kann ein erheblicher Leistungsgewinn erzielt werden.

Wir könnten diesen temporären Puffer im Userspace überspringen, wenn es eine Möglichkeit gäbe, direkt auf den Puffer im Kernelspace zuzugreifen. Java NIO bietet dazu eine Möglichkeit.

ByteBuffer gehört zu mehreren Puffern, die von Java NIO bereitgestellt werden. Es ist nur ein Behälter oder Vorratstank, aus dem Daten gelesen oder in den Daten geschrieben werden können. Das obige Verhalten wird durch die Zuweisung eines direkten Puffers erreicht allocateDirect() API auf Puffer.

Die Java-Dokumentation von Byte Buffer enthält nützliche Informationen.

Benutzer-Avatar
Dheeru Mundluru

Hier ist ein großartiger Artikel, der die Vorteile von ByteBuffer erklärt. Nachfolgend die wichtigsten Punkte des Artikels:

  • Erster Vorteil eines ByteBuffers egal ob direkt oder indirekt effizienter wahlfreier Zugriff von strukturierten Binärdaten (z. B. Low-Level-IO wie in einer der Antworten angegeben). Vor Java 1.4 konnte man zum Lesen solcher Daten einen DataInputStream verwenden, jedoch ohne wahlfreien Zugriff.

Im Folgenden sind die Vorteile speziell für direkten ByteBuffer/MappedByteBuffer aufgeführt. Beachten Sie, dass direkte Puffer außerhalb des Heaps erstellt werden:

  1. Unbeeinflusst von GC-Zyklen: Direkte Puffer werden während Garbage-Collection-Zyklen nicht verschoben, da sie sich außerhalb des Heaps befinden. TerraCotas BigMemory Caching-Technologie scheint sich stark auf diesen Vorteil zu verlassen. Wenn sie auf dem Haufen wären, würde es die GC-Pausenzeiten verlangsamen.

  2. Leistungsschub: In Stream IO würden Leseaufrufe Systemaufrufe nach sich ziehen, die einen Kontextwechsel zwischen Benutzer- und Kernelmodus und umgekehrt erfordern, was kostspielig wäre, insbesondere wenn ständig auf die Datei zugegriffen wird. Mit Memory-Mapping wird diese Kontextumschaltung jedoch reduziert, da Daten eher im Speicher (MappedByteBuffer) zu finden sind. Wenn Daten im Speicher verfügbar sind, wird direkt darauf zugegriffen, ohne das Betriebssystem aufzurufen, dh ohne Kontextumschaltung.

Beachten Sie, dass MappedByteBuffers sehr nützlich sind, insbesondere wenn die Dateien groß sind und auf wenige Gruppen von Blöcken häufiger zugegriffen wird.

  1. Seitenfreigabe: Speicherabgebildete Dateien können zwischen Prozessen gemeinsam genutzt werden, da sie im virtuellen Speicherbereich des Prozesses zugewiesen sind, und können von Prozessen gemeinsam genutzt werden.

Benutzer-Avatar
irgendein Benutzer

In Android können Sie einen gemeinsamen Puffer zwischen C++ und Java (mit der directAlloc-Methode) erstellen und ihn auf beiden Seiten manipulieren.

1355230cookie-checkWas ist die Verwendung von ByteBuffer in Java? [closed]

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy