プログラム悪戦苦闘日記

はてなダイアリーからの移行(遺物)

Java New I/O -part2-

 
 前回の続き。バッファについてまとめてみる。前回書いたように、バッファはただのデータの入れ物であり、boolean以外のプリミティブタイプが用意されている。Bufferは、いわゆる「固定長データ」であり、可変長にはできないようだ。Bufferの中で重要なのは、ByteBufferとCharBufferの2つだと思う。

 Bufferでややこしいのは4つの属性だ。現在位置と容量だけあればいいように思うがそうではないらしい。4つの属性の関係は下の通り。

         0                           読み書きできない領域
 Buffer: [--------------------------|*******]
              ^        ^            ^       ^
             mark   position      limit  capacity

各属性の意味は、

  • capacity

バッファの容量。一度設定したら変更できない。

  • position

現在のバッファの位置

  • mark

位置を記憶させておく。reset()メソッドによってpositionをこの位置まで戻すことができる。かならずposition以下の値でなければならない。

  • limit

この位置から読み書きしてはいけない領域。かならずcapacity以下の値でなければならない。limit(int)でlimit値を設定できる。
 
 バッファに対する読み書きは それぞれget(), put()メソッドで行うだけであり、特にややこしいところはない。しかし、バッファ自体の操作はいろいろあってややこしいので整理しておく。

  • clear()

positionを0、limitをcapacityに設定する。markは破棄される。多分こんな感じ↓

 [-------------------------------]
 ^                               ^
 position                        capacity = limit

ちなみに、clear()を呼んでも中身のデータは破棄されない。

  • flip()

limitをpositionの値にして、positionを0にする。マークは破棄される。

 [----------------+---------********]
     ^            ^         ^       ^
     mark         position  limit   capacity

                ↓ これがこうなる

 [----------------+******************]
 ^                ^                  ^
 position         limit              capacity
  • rewind()

positionを0に設定して、markは破棄される。

  • reset()

positionをmarkに設定する。
 
 今回はこんなところか。次回はチャネルのはなしをしようと思う。