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に設定する。
今回はこんなところか。次回はチャネルのはなしをしようと思う。