Quali sono le applicazioni di esempio per a ByteBuffer
in Java? Elenca tutti gli scenari di esempio in cui viene utilizzato. Grazie!
Quali sono le applicazioni di esempio per a ByteBuffer
in Java? Elenca tutti gli scenari di esempio in cui viene utilizzato. Grazie!
Risposte:
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.
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
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.
In Android puoi creare un buffer condiviso tra C ++ e Java (con il metodo directAlloc) e manipolarlo in entrambi i lati.
Ecco un ottimo articolo che spiega i vantaggi di ByteBuffer. Di seguito sono riportati i punti chiave nell'articolo:
Di seguito sono riportati i vantaggi specifici per ByteBuffer diretto / MappedByteBuffer. Si noti che i buffer diretti vengono creati al di fuori dell'heap:
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.
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.