A che serve ByteBuffer in Java? [chiuso]


199

Quali sono le applicazioni di esempio per a ByteBufferin Java? Elenca tutti gli scenari di esempio in cui viene utilizzato. Grazie!


1
La compressione di Apache Hadoop (ad esempio il codec zlib) utilizza ByteBuffer da jave.nio.
Nikk,

Buono per l'invio di dati alle GPU.
Pixel

Risposte:


138

Questa è una buona descrizione dei suoi usi e difetti. Lo si utilizza essenzialmente ogni volta che è necessario eseguire I / O di basso livello velocemente. Se avessi intenzione di implementare un protocollo TCP / IP o se stavi scrivendo un database (DBMS) questa classe sarebbe utile.


3
È utile in un sito Web ad alto traffico sviluppato utilizzando Java e Cassandra DB?
Aklin,

1
Dopo una rapida ricerca, sembra che Sì, Cassandra utilizzi ByteBuffer: mail-archive.com/commits@cassandra.apache.org/msg14967.html Se ti stai chiedendo un sito Web non elaborato , potrebbe esserci, ma in genere è solo sarà usato indirettamente dai siti Web - usando strumenti come cassandra
kelloti il

1
non è un brutto collegamento, grazie. vorrei aggiungere questo che ho trovato utile - worldmodscode.wordpress.com/2012/12/14/…
Peter Perháč,

Cattivo collegamento temo ...
RoyalBigMack

96

La classe ByteBuffer è importante perché costituisce una base per l'uso dei canali in Java. La classe ByteBuffer definisce sei categorie di operazioni su buffer di byte, come indicato nella documentazione di Java 7 :

  • Metodi get e put assoluti e relativi che leggono e scrivono singoli byte;

  • La massa relativa ottiene metodi che trasferiscono sequenze contigue di byte da questo buffer in un array;

  • Metodi relativi di put bulk che trasferiscono sequenze contigue di byte da un array di byte o qualche altro buffer di byte in questo buffer;

  • Metodi get e put assoluti e relativi che leggono e scrivono valori di altri tipi primitivi, traducendoli da e verso sequenze di byte in un particolare ordine di byte;

  • Metodi per la creazione di buffer di visualizzazione, che consentono di visualizzare un buffer di byte come buffer contenente valori di qualche altro tipo primitivo; e

  • Metodi per compattare , duplicare e tagliare un buffer di byte.

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
la maggior parte di questo commento viene copiata dai documenti java 7 .
Janus Troelsen,

6
A meno che tu non stia approfittando di un effetto collaterale non ovvio, credo che potresti usare il metodo sbagliato per la put assoluta. Javadoc sembra indicare che il put assoluto richiede un valore di indice.
Chuck Wolber,

6
anche se è solo una copia di api doc, è persino preoccupato del suo punteggio perché alcune persone sembrano essere troppo pigre per dargli un'occhiata.
Chris,

1
C'è un errore in uno degli esempi. Il "put assoluto", manca il primo parametro che rappresenta l'indice (0 in questo caso).
bvdb,

21

L'IO Java tramite API orientate al flusso viene eseguita utilizzando un buffer come memoria temporanea di dati nello spazio utente. I dati letti dal disco da DMA vengono prima copiati nei buffer nello spazio del kernel, che viene poi trasferito nel buffer nello spazio utente. Quindi c'è un sovraccarico. Evitarlo può ottenere un notevole guadagno in termini di prestazioni.

Potremmo saltare questo buffer temporaneo nello spazio utente, se ci fosse un modo per accedere direttamente al buffer nello spazio del kernel. Java NIO fornisce un modo per farlo.

ByteBufferè tra i numerosi buffer forniti da Java NIO. È solo un contenitore o un serbatoio di raccolta per leggere o scrivere dati da. Il comportamento sopra è ottenuto allocando un buffer diretto utilizzando l' allocateDirect()API sul buffer.

La documentazione Java di Byte Buffer contiene informazioni utili.


14

In Android puoi creare un buffer condiviso tra C ++ e Java (con il metodo directAlloc) e manipolarlo in entrambi i lati.


13

Ecco un ottimo articolo che spiega i vantaggi di ByteBuffer. Di seguito sono riportati i punti chiave nell'articolo:

  • Il primo vantaggio di un ByteBuffer indipendentemente dal fatto che sia diretto o indiretto è un accesso casuale efficiente di dati binari strutturati (ad esempio, IO di basso livello come indicato in una delle risposte). Prima di Java 1.4, per leggere tali dati si poteva usare un DataInputStream, ma senza accesso casuale.

Di seguito sono riportati i vantaggi specifici per ByteBuffer diretto / MappedByteBuffer. Si noti che i buffer diretti vengono creati al di fuori dell'heap:

  1. Non influenzato dai cicli gc : i buffer diretti non verranno spostati durante i cicli di garbage collection poiché risiedono al di fuori dell'heap. La tecnologia di memorizzazione nella cache BigMemory di TerraCota sembra fare molto affidamento su questo vantaggio. Se fossero in heap, rallenterebbe i tempi di pausa gc.

  2. Aumento delle prestazioni : nello stream IO, le chiamate in lettura comporterebbero chiamate di sistema, che richiedono un cambio di contesto tra la modalità utente e kernel e viceversa, il che sarebbe costoso soprattutto se si accedesse costantemente al file. Tuttavia, con la mappatura della memoria questo cambio di contesto viene ridotto poiché è più probabile che i dati vengano trovati in memoria (MappedByteBuffer). Se i dati sono disponibili in memoria, si accede direttamente senza invocare il sistema operativo, vale a dire nessuna commutazione di contesto.

Si noti che MappedByteBuffers sono molto utili soprattutto se i file sono grandi e pochi gruppi di blocchi sono accessibili più frequentemente.

  1. Condivisione della pagina : i file associati alla memoria possono essere condivisi tra i processi poiché sono allocati nello spazio di memoria virtuale del processo e possono essere condivisi tra i processi.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.