EeBlog(テクニカルブログ)

第103回 バッファの操作

今回は「バッファの操作」について見ていきます。

ByteBufferクラスには、バッファの読み書きをするメソッドとしてputメソッド、getメソッドがあります。
これらのメソッドには、相対位置に対して読み書きするものと絶対位置に対して読み書きするものがあります。
相対位置に対する読み書きでは、バッファの現在位置(position)から読み書きを行います。
絶対位置に対する読み書きでは、バッファの指定されたインデックス位置の読み書きを行います。


次のプログラムの実行によりバッファ操作時のプロパティ(positionとlimitのみ)の値を確認します。

import java.nio.Buffer;

import java.nio.ByteBuffer;


 public class Main {


     private static final String DATA = "株式会社イーブ";
     private static final byte[] BYTE_DATA = DATA.getBytes();
     private static final String MESSAGE_FORMAT 
                              = "position:%2$d  limit:%3$d (%1$s)"
                                + System.getProperty("line.separator");


     public static void main(String[] args) {
         ByteBuffer byteBuffer = ByteBuffer.allocate(256);
         messageOut("バッファ生成", byteBuffer);
         messageOut("絶対put実行", byteBuffer.put(0, (byte) 0));
         messageOut("相対put実行", byteBuffer.put(BYTE_DATA));
         messageOut("flip実行", byteBuffer.flip());
         byteBuffer.get(0);
         messageOut("絶対get実行", byteBuffer);
         messageOut("相対get実行", byteBuffer.get(new byte[BYTE_DATA.length]));
         messageOut("rewind実行", byteBuffer.rewind());
         messageOut("clear実行", byteBuffer.clear());
     }


     private static void messageOut(String string, Buffer buffer) {
         System.out.printf(MESSAGE_FORMAT, string, buffer.position()
                                                 , buffer.limit());
     }
 }

実行すると次のように出力されます。
position:0 limit:256 (バッファ生成)
position:0 limit:256 (絶対put実行)
position:14 limit:256 (相対put実行)
position:0 limit:14 (flip実行)
position:0 limit:14 (絶対get実行)
position:14 limit:14 (相対get実行)
position:0 limit:14 (rewind実行)
position:0 limit:256 (clear実行)

相対位置に対する読み書きではpositionの値が変わっていますが、絶対位置に対する読み書きではpositionの値は変わっていません。

ちなみに、前回、前々回に使用したReadableByteChannelのreadメソッド、WritableByteChannelのwriteメソッドなどはバッファの相対位置に対して読み書きを行うものです。