Java'da ByteBuffer'ın kullanımı nedir? [kapalı]


199

ByteBufferJava'da bir için örnek uygulamalar nelerdir ? Lütfen bunun kullanıldığı örnek senaryoları listeleyin. Teşekkür ederim!


1
Apache Hadoop'un sıkıştırması (örneğin zlib codec bileşeni) jave.nio'dan ByteBuffer kullanır.
nikk

GPU'lara veri göndermek için iyi.
Piksel

Yanıtlar:


138

Bu , kullanımlarının ve eksikliklerinin iyi bir açıklamasıdır. Hızlı düşük seviyeli G / Ç yapmanız gerektiğinde esas olarak kullanırsınız. Bir TCP / IP protokolü uygulayacaksanız veya bir veritabanı (DBMS) yazıyorsanız, bu sınıf kullanışlı olacaktır.


3
Java ve Cassandra DB kullanılarak geliştirilen yüksek trafikli bir web sitesinde herhangi bir yerde yararlı mı?
Aklin

1
Hızlı bir aramadan sonra, evet, Cassandra ByteBuffer kullanıyor gibi görünüyor: mail-archive.com/commits@cassandra.apache.org/msg14967.html Ham bir web sitesi merak ediyorsanız, olabilir, ancak genellikle web siteleri tarafından dolaylı olarak kullanılacaktır - cassandra
kelloti

1
kötü bir bağlantı değil, teşekkürler. yararlı buldum bunu eklemek istiyorum - worldmodscode.wordpress.com/2012/12/14/…
Peter Perháč 10:16

Kötü bağlantı korkarım ...
RoyalBigMack

96

ByteBuffer sınıfı önemlidir, çünkü Java'da kanalların kullanımı için bir temel oluşturur. ByteBuffer sınıfı , Java 7 belgelerinde belirtildiği gibi, bayt arabellekleri üzerinde altı işlem kategorisi tanımlar :

  • Mutlak ve bağıl olsun ve koyun okumak ve tek bayt yazma yöntemleri;

  • Bu tampondan bitişik bayt dizilerini bir diziye aktaran göreceli toplu alma yöntemleri;

  • Bir bayt dizisinden veya başka bir bayt tamponundan bitişik bayt dizilerini bu tampona aktaran göreceli yığın koyma yöntemleri;

  • Diğer ilkel tiplerin değerlerini okuyan ve yazan, belirli bir bayt sırasına göre bayt dizilerine ve bayt dizilerinden çeviri yapan mutlak ve göreli alma ve koyma yöntemleri;

  • Bir bayt tamponunun başka bir ilkel tipte değerler içeren bir tampon olarak görülmesini sağlayan görünüm tamponları oluşturma yöntemleri; ve

  • Bayt tamponunu sıkıştırma , çoğaltma ve dilimleme yöntemleri .

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
bu yorumun büyük kısmı java 7 dokümanından kopyalanır .
Janus Troelsen

6
Açık olmayan bir yan etkiden faydalanmadığınız sürece, mutlak koyma için yanlış yöntemi kullanıyor olabileceğinize inanıyorum. Javadoc, mutlak putun bir indeks değeri gerektirdiğini gösteriyor.
Chuck Wolber

6
api doc sadece bir kopyası olsa bile onun puanı bcs bile bazı insanlar bakmak için çok tembel gibi görünüyor.
Chris

1
Örneklerden birinde bir hata var. "Mutlak değer", dizini temsil eden ilk parametreyi (bu durumda 0) kaçırır.
bvdb

21

Akışa yönelik API'leri kullanan Java IO, kullanıcı alanı içinde verilerin geçici olarak depolanması için bir tampon kullanılarak gerçekleştirilir. DMA tarafından diskten okunan veriler ilk olarak çekirdek boşluğunda arabelleklere kopyalanır ve daha sonra kullanıcı alanında ara belleğe aktarılır. Dolayısıyla ek yük var. Bundan kaçınmak performansta önemli bir kazanç sağlayabilir.

Çekirdek boşluğunda arabelleğe doğrudan erişmenin bir yolu varsa, bu geçici arabelleği kullanıcı alanında atlayabiliriz. Java NIO bunu yapmanın bir yolunu sunar.

ByteBufferJava NIO tarafından sağlanan birçok arabellek arasındadır. Sadece bir konteyner veya depolama tankı veri okumak veya veri yazmak için. Yukarıdaki davranış, Tampon üzerinde allocateDirect()API kullanılarak doğrudan bir tampon tahsis edilerek elde edilir .

Byte Buffer Java Dokümantasyonu yararlı bilgiler içerir.


14

Android'de C ++ ve Java arasında paylaşılan arabellek oluşturabilir (directAlloc yöntemiyle) ve her iki tarafta da değiştirebilirsiniz.


13

İşte ByteBuffer'ın faydalarını açıklayan harika bir makale. Makaledeki anahtar noktalar şunlardır:

  • Doğrudan veya dolaylı olup olmadığına bakılmaksızın bir ByteBuffer'ın ilk avantajı, yapılandırılmış ikili verilere (örn., Cevaplardan birinde belirtildiği gibi düşük seviyeli IO) verimli rasgele erişimdir . Java 1.4'ten önce, bu tür verileri okumak için rasgele erişim olmadan bir DataInputStream kullanılabilir.

Aşağıda özellikle doğrudan ByteBuffer / MappedByteBuffer için avantajlar bulunmaktadır. Doğrudan arabelleklerin yığın dışında oluşturulduğunu unutmayın:

  1. Gc döngülerinden etkilenmez : Doğrudan arabellekler, çöp toplama döngüleri sırasında yığın dışında kaldıklarından taşınmazlar. TerraCota'nın BigMemory önbellek teknolojisi bu avantaja çok fazla güveniyor gibi görünüyor. Öbek üzerinde olsaydı, gc duraklama sürelerini yavaşlatırdı.

  2. Performans artışı : Akış IO'sunda, okuma çağrıları, özellikle çekirdeğe sürekli olarak erişiliyorsa, kullanıcının çekirdek moduna ve tam tersi arasında bağlamsal bir geçiş gerektiren sistem çağrıları gerektirecektir. Bununla birlikte, bellek eşlemede, verilerin bellekte bulunması daha olası olduğundan bu bağlam değiştirme azaltılır (MappedByteBuffer). Bellekte veri varsa, işletim sistemi çağrılmadan doğrudan erişilir, yani bağlam değiştirilmez.

MappedByteBuffers'ın özellikle dosyalar büyükse ve birkaç blok grubuna daha sık erişiliyorsa çok yararlı olduğunu unutmayın.

  1. Sayfa paylaşımı : Eşlenen bellek dosyaları, işlemin sanal bellek alanına tahsis edildiği için işlemler arasında paylaşılabilir ve işlemler arasında paylaşılabilir.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.