Apa gunanya ByteBuffer di Jawa? [Tutup]


199

Apa contoh aplikasi untuk ByteBufferdi Jawa? Harap sebutkan contoh skenario di mana ini digunakan. Terima kasih!


1
Kompresi Apache Hadoop (misalnya zlib codec) menggunakan ByteBuffer dari jave.nio.
nikk

Bagus untuk mengirim data ke GPU.
Pixel

Jawaban:


138

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.


3
Apakah ini berguna di situs web traffic tinggi yang dikembangkan menggunakan Java & Cassandra DB?
Aklin

1
Setelah pencarian cepat, tampaknya ya, Cassandra memang menggunakan ByteBuffer: mail-archive.com/commits@cassandra.apache.org/msg14967.html Jika Anda bertanya-tanya tentang situs web mentah, mungkin ada, tetapi biasanya hanya, akan digunakan oleh situs web secara tidak langsung - dengan menggunakan alat seperti cassandra
kelloti

1
bukan tautan yang buruk, terima kasih. ingin menambahkan yang ini saya temukan berguna - worldmodscode.wordpress.com/2012/12/14/…
Peter Perháč

Tautan buruk, saya takut ...
RoyalBigMack

96

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

56
sebagian besar komentar ini disalin dari java 7 docs .
Janus Troelsen

6
Kecuali jika Anda mengambil keuntungan dari efek samping yang tidak jelas, saya percaya Anda mungkin menggunakan metode yang salah untuk put absolut. Javadoc tampaknya menunjukkan bahwa put absolut membutuhkan nilai indeks.
Chuck Wolber

6
bahkan jika itu hanya salinan dari api dokumen itu bahkan lebih buruk nilainya bcs beberapa orang tampaknya terlalu malas untuk melihatnya.
Chris

1
Ada kesalahan dalam salah satu contoh. "Put absolut", melewatkan parameter pertama yang mewakili indeks (0 dalam kasus ini).
bvdb

21

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.

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


14

Di Android Anda dapat membuat buffer bersama antara C ++ dan Java (dengan metode directAlloc) dan memanipulasinya di kedua sisi.


13

Berikut ini adalah artikel yang bagus menjelaskan manfaat ByteBuffer. Berikut ini adalah poin utama dalam artikel:

  • Keuntungan pertama dari ByteBuffer terlepas dari apakah itu langsung atau tidak langsung adalah akses acak yang efisien dari data biner terstruktur (misalnya, IO tingkat rendah sebagaimana dinyatakan dalam salah satu jawaban). Sebelum ke Java 1.4, untuk membaca data seperti itu seseorang dapat menggunakan DataInputStream, tetapi tanpa akses acak.

Berikut ini adalah manfaat khusus untuk ByteBuffer langsung / MappedByteBuffer. Perhatikan bahwa buffer langsung dibuat di luar tumpukan:

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

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

  1. Berbagi halaman : File yang dipetakan memori dapat dibagi antara proses karena dialokasikan dalam ruang memori virtual proses dan dapat dibagi di seluruh proses.
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.