ByteBuffer
Java'da bir için örnek uygulamalar nelerdir ? Lütfen bunun kullanıldığı örnek senaryoları listeleyin. Teşekkür ederim!
ByteBuffer
Java'da bir için örnek uygulamalar nelerdir ? Lütfen bunun kullanıldığı örnek senaryoları listeleyin. Teşekkür ederim!
Yanıtlar:
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.
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
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.
ByteBuffer
Java 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 .
İşte ByteBuffer'ın faydalarını açıklayan harika bir makale. Makaledeki anahtar noktalar şunlardır:
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:
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ı.
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.