20 Temmuz 2018 Cuma

ByteBuffer Sınıfı

Giriş
Şu satırları dahil ederiz.
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
Buffer sınıfından kalıtır. Bu sınıf mevcut bir byte[] nesnesini wrap() metodu ile sarmalayabilir, ya da allocate metodu ile bir bellek alanı yaratabilir.

putX() metodları ile yazma işlemi yapılır. getX() metodları ile okuma işlemi yapılır.

allocate metodu
Şöyle yaparız.
ByteBuffer bb = ByteBuffer.allocate(4);
allocateDirect metodu
Açıklaması şöyle. Bir DirectByteBuffer  nesnesi yaratır.
The contents of direct buffers may reside outside of the normal garbage-collected heap
Açıklaması şöyle.
When such an object is created, it makes an internal call that allocates the amount of native memory equal to the buffer capacity. This memory is released when this class’ equivalent of “finalize” Java method is called — either automatically, when the DirectByteBuffer  instance is GCed, or manually, which is rare.
Bellek alanı Java Heap dışında olsa bile, nesnenin kendisi halen JVM içinde yaşadığı için GC başlayıncaya kadar nesne silinmez.
Direct ByteBuffer objects clean up their native buffers automatically but can only do so as part of Java heap GC — so they do not automatically respond to pressure on the native heap. GC occurs only when the Java heap becomes so full it can't service a heap-allocation request or if the Java application explicitly requests it (not recommended because it causes performance problems).
DirectByteBuffer nesnesin kullandığı belleğe, işletim sistemi erişebilir.

array metodu
Eğer allocate metodu ile bellek alanı yaratılmışsa, bu alana erişmek için kullanılır. Şöyle yaparız. Bu metod okuma yazma pozisyonuna dikkat etmez. Tüm dizi bellek alanını döndürür.
byte[] result = bb.array();
arrayOffset metodu
Şöyle yaparız.
int arrayOffset = bb.arrayOffset();
asDoubleBuffer metodu
Şöyle yaparız.
ByteBuffer bb = ...;
DoubleBuffer db = bb.asDoubleBuffer();
clear metodu
Buffer nesnesinin pozisyon değerini 0 yapar. Yani daha önce kullanılmış bir nesneyi tekrar yazmaya hazır hale getirir. flip() metodunun tersi diye düşünülebilir.
Örnek
Şöyle yaparız.
ByteBuffer bb = ...;
bb.clear();
Örnek
Şöyle yaparız.
ByteBuffer b = new ByteBuffer(1024);
for(int i=0; i<N; i++) {
  b.clear(); //Make ready for write
  b.put(header[i]);
  b.put(data[i]);
  b.flip(); //Make ready for read
  out.write(b);
}
compact metodu
Şöyle yaparız.
buffer.compact();
flip metodu
Yazma işlemi bittikten sonra okumaya hazır hale getirmek için kullanılır. Açıklaması şöyle.
When you are done putting bytes into the buffer, you should flip it.
Şöyle yaparız.
ByteBuffer bb = ByteBuffer.allocate(1024);
... //Put data
bb.flip();
get metodu
byte okur. Şöyle yaparız. Current position ilerletilir.
ByteBuffer bb =..
byte[] b = new byte[bb.remaining()]
bb.get(b);
getFloat metodu
Şöyle yaparız. Current position ilerletilir.
float v = ByteBuffer.wrap(...).order(ByteOrder.BIG_ENDIAN).getFloat();
getInt metodu - offset
16. int'e erişmek için şöyle yaparız. Current position ilerletilmez.
System.out.println(bb.getInt(16*4));
System.out.println(bb.asIntBuffer().get(16));
getShort metodu
Şöyle yaparız. Current position ilerletilir.
ByteBuffer bb = ...;
short s  = bb.getShort();
hasArray metodu
Şöyle yaparız.
ByteBuffer bb = ...;
if (buffer.hasArray()) {
  byte[] array = buffer.array();
  int arrayOffset = buffer.arrayOffset();
  return Arrays.copyOfRange(array, arrayOffset + buffer.position(),
                              arrayOffset + buffer.limit());
}
hasRemaining metodu
Okumak veya yazmak için kullanılır.
Örnek
Sonuna kadar okumak için şöyle yaparız.
while(buffer.hasRemaining()) {
  file.write(buffer);
}
limit metodu
Açıklaması şöyle.
mark <= position <= limit <= capacity
Şöyle yaparız.
ByteBuffer b= ByteBuffer.allocate(10); // capacity = 10, limit = 10
b.limit(1);    //set limit to 1
b.put((byte)1);
b.put((byte)1); //causes java.nio.BufferOverflowException
order metodu
Buffer little endian olarak okunabilir.
Örnek
Şöyle yaparız.
byte[] buf = new byte[512];
ByteBuffer bb = ByteBuffer.wrap(buf).order(ByteOrder.LITTLE_ENDIAN);
Örnek
Şöyle yaparız.
ByteBuffer buf = ByteBuffer.wrap(new byte[] { (byte)0xC2, (byte)0x95, 0x3C, 0x2C,
  (byte)0xC1, 0x6B, (byte)0xD6, 0x41 });
double d = buf.order(ByteOrder.LITTLE_ENDIAN).getDouble();
position metodu
Şöyle yaparız.
Arrays.copyOf(buffer.array(), 0, buffer.position());
put metodu - byte
Şöyle yaparız.
bb.put((byte)12);
put metodu - byte []
Şöyle yaparız. Current position ilerletilir.
bb.put("one\ntwo\nthree\nfour\n".getBytes());
putInt metodu
Şöyle yaparız. Current position ilerletilir.
int totalPacket = ...;
bb.putInt(totalPacket);
putShort metodu
Şöyle yaparız.
bb.putShort((short)0x03);
remaining metodu
Okumak veya yazmak için kullanılır. Geriye kalan alanı döner.
ByteBuffer bb =..

byte[] b = new byte[bb.remaining()]
bb.get(b, 0, b.length);
slice metodu
Şöyle yaparız.
byte[] test = "Hello World".getBytes("Latin1");
ByteBuffer b1 = ByteBuffer.wrap(test);
byte[] hello = new byte[6];
b1.get(hello);
ByteBuffer b2 = b1.slice(); // position = 0, string = "World"
byte[] tooLong = b2.array(); // Will NOT be "World", but will be "Hello World".
byte[] world = new byte[5];
b2.get(world); // world = "World"
wrap metodu
Örnek - byte []
Şöyle yaparız.
byte[] buf = new byte[512];
ByteBuffer bb = ByteBuffer.wrap(buf);
Örnek - String
Şöyle yaparız.
ByteBuffer buffer = ByteBuffer.wrap("...".getBytes());
Socket ile Kullanım
Yazmak için şöyle yaparız.
SocketChannel socketChannel = ...;

ByteBuffer buf = ...;

//write
while(buf.hasRemaining()) {
  socketChannel.write(buf);
}
Okumak için şöyle yaparız.
//read
ByteBuffer inBuf = ByteBuffer.allocate(78);
if socketChannel.read(inBuf) > 0) {...}

Hiç yorum yok:

Yorum Gönder