2016/06/21

[java]ByteBufferに手こずる

JavaにByteBufferなるものがあることを知り、byte[]でわざわざ受信データが来るたびにnewし直して、System.arraycopy()で連結して、という手間が省けそうだと思って使ってみた。

 

が、何か、何かピンとこないのだ。
なんでだろう?

 

たぶん、get()してもput()してもposition()が動くからじゃなかろうか。
ポインタが1つしかないから、自分で「今は書込むだけ」とか「今は読込むだけ」とか決めておくか、別変数で位置を管理するなどしないといかんだろう。

今の使い方だと、受信データが来たらput()で追加していき、読む方はarray()で配列を取ってきて、読込み済みの位置を自分で管理、なのかな。

 

あと、array()したときに取得できるのがcapacityの分までなので、limit()のところまで切り取りたいときには、新たにbyte[]でほしい分だけnewした後にSystem.arraycopy()とかでコピーすることになりそうだ。
get()だと、positionが動いてしまうから、書込みメインで使うとそうなるんじゃなかろうか。

 

戻り値としてByteBufferを返すときには、positionを0に、limitをデータの終わりまでにしていたのだが、こういうときにflip()が使えるんだな(ネットで調べた)。
今は、

bb.position(0);
bb.limit(bbArray.length);

みたいにしていたのだ。
でも、メソッドでやらなくてもいいなら、こっちの方がわかりやすい気がするけど、うーん、どうなんだろう?


ひとまず、書込みと読込を並行して行うような使い方はしない、ということさえわかればなんとかなりそうだ。

ただ、こういうのに向いたclassがあるんじゃなかろうか、という気がしなくもない。
それを探し続ける時間もないから今回はByteBufferにするけど、環境が優雅になったらなったで悩みが出てくるものですな。

0 件のコメント:

コメントを投稿

コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。

注: コメントを投稿できるのは、このブログのメンバーだけです。