Apa contoh aplikasi untuk ByteBuffer
di Jawa? Harap sebutkan contoh skenario di mana ini digunakan. Terima kasih!
Apa contoh aplikasi untuk ByteBuffer
di Jawa? Harap sebutkan contoh skenario di mana ini digunakan. Terima kasih!
Jawaban:
Ini adalah deskripsi yang baik tentang penggunaan dan kekurangannya. Anda pada dasarnya menggunakannya kapan pun Anda perlu melakukan I / O tingkat rendah yang cepat. Jika Anda akan mengimplementasikan protokol TCP / IP atau jika Anda sedang menulis database (DBMS) kelas ini akan berguna.
Kelas ByteBuffer penting karena membentuk dasar untuk penggunaan saluran di Jawa. Kelas ByteBuffer mendefinisikan enam kategori operasi berdasarkan buffer byte, sebagaimana dinyatakan dalam dokumentasi Java 7 :
Mutlak dan relatif mendapatkan dan menempatkan metode yang membaca dan menulis byte tunggal;
Massal relatif mendapatkan metode yang mentransfer urutan byte yang berdekatan dari buffer ini ke dalam array;
Metode curah massal relatif yang mentransfer urutan byte yang berdekatan dari array byte atau buffer byte lain ke buffer ini;
Mutlak dan relatif mendapatkan dan menempatkan metode yang membaca dan menulis nilai dari tipe primitif lainnya, menerjemahkannya ke dan dari urutan byte dalam urutan byte tertentu;
Metode untuk membuat buffer tampilan, yang memungkinkan buffer byte dilihat sebagai buffer yang mengandung nilai dari beberapa tipe primitif lainnya; dan
Metode untuk memadatkan , menduplikasi , dan mengiris buffer 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
Java IO menggunakan API berorientasi aliran dilakukan dengan menggunakan buffer sebagai penyimpanan sementara data dalam ruang pengguna. Data yang dibaca dari disk oleh DMA pertama kali disalin ke buffer di ruang kernel, yang kemudian ditransfer ke buffer di ruang pengguna. Karenanya ada overhead. Menghindarinya dapat mencapai perolehan kinerja yang cukup besar.
Kita bisa melewati buffer sementara ini di ruang pengguna, jika ada cara langsung untuk mengakses buffer di ruang kernel. Java NIO menyediakan cara untuk melakukannya.
ByteBuffer
adalah di antara beberapa buffer yang disediakan oleh Java NIO. Ini hanya sebuah wadah atau tangki penampung untuk membaca data dari atau menulis data. Perilaku di atas dicapai dengan mengalokasikan buffer langsung menggunakan allocateDirect()
API pada Buffer.
Dokumentasi Java dari Byte Buffer memiliki informasi berguna.
Di Android Anda dapat membuat buffer bersama antara C ++ dan Java (dengan metode directAlloc) dan memanipulasinya di kedua sisi.
Berikut ini adalah artikel yang bagus menjelaskan manfaat ByteBuffer. Berikut ini adalah poin utama dalam artikel:
Berikut ini adalah manfaat khusus untuk ByteBuffer langsung / MappedByteBuffer. Perhatikan bahwa buffer langsung dibuat di luar tumpukan:
Tidak terpengaruh oleh siklus gc : Buffer langsung tidak akan dipindahkan selama siklus pengumpulan sampah karena mereka berada di luar tumpukan. Teknologi caching BigMemory TerraCota tampaknya sangat bergantung pada keunggulan ini. Jika mereka berada di tumpukan, itu akan memperlambat gc jeda kali.
Peningkatan kinerja : Dalam aliran IO, panggilan baca akan memerlukan panggilan sistem, yang memerlukan pemindahan konteks antara pengguna ke mode kernel dan sebaliknya, yang akan mahal terutama jika file diakses terus-menerus. Namun, dengan pemetaan memori, pengalihan konteks ini berkurang karena data lebih mungkin ditemukan dalam memori (MappedByteBuffer). Jika data tersedia dalam memori, itu diakses secara langsung tanpa menggunakan OS, yaitu, tidak ada pengalihan konteks.
Perhatikan bahwa MappedByteBuffers sangat berguna terutama jika file berukuran besar dan beberapa grup blok diakses lebih sering.