ByteBufferの使用説明について
前にByteBufferの使用を見ましたが、問題はまだ若いので、今は古いです.だから、忘れました.ソースコードを見て理解しようと決心しました.
ByteBufferのAPIを調べてみます.見ているのは霧です.どんなマルク、position、limit、flip、resetの使い方が分かりません.まず次の例を見ます.
ByteBufferのAPIを調べてみます.見ているのは霧です.どんなマルク、position、limit、flip、resetの使い方が分かりません.まず次の例を見ます.
String str = "helloWorld";
ByteBuffer buff = ByteBuffer.wrap(str.getBytes());
System.out.println("position:"+buff.position()+"\t limit:"+buff.limit());
//
buff.get();
buff.get();
System.out.println("position:"+ buff.get(buff.position())+"\t limit:"+buff.limit());
buff.mark();
System.out.println("position:"+buff.position()+"\t limit:"+buff.limit());
buff.flip();
System.out.println("position:"+buff.position()+"\t limit:"+buff.limit());
:
position:0 limit:10
position:2 limit:10
position:2 limit:10
position:0 limit:2
たちは がよく っている「ハローワールド」を っています.「ByteBufferで を します.ByteBufferは なタイプなので、wrapで した が に ってくるのはHeappyteBufferの です.HeappyteBufferはByteBufferのサブクラスで、 じByteBufferはBufferの なタイプのサブクラスです. のmark、freet、freet、Pure、Pure、PureはBure、Purerのサブクラスです.
いくつかの を します.wrap を び した 、Bufferで された は の りです.
コメント:
m:mark;
p:position;
L:limit;
の はmarkは の を す の−1であり、postionは の を す0であり、Limitはbyte[]として えられた さである.
これが の の です.
m
p
L
-1
0
1
2
3
4
5
6
7
8
9
H
E
L
L
O
W
O
R
L
D
たちが2 してget()メソッドを び して2バイトを すると、 び しごとにposition++の がトリガされます.この 、positionはindex=2のところに します.この 、Limitとmarkは しません. み った2バイトが されるとHとEになりますので、 は 2のギルドにあります.
position:2 limit:10 です
m、p
L
-1
0
1
2
3
4
5
6
7
8
9
H
E
L
L
O
W
O
R
L
D
み わったら はマークを います.この はマルクは-1から2とpositionに して じ を します.Limitは わらないと られます.
m
p
L
-1
0
1
2
3
4
5
6
7
8
9
H
E
L
L
O
W
O
R
L
D
マークを った のpositionでflipを び したら、その でLimitはpositionの を し、markとpositionを に します.これでlimitは 2という ですか?つまり、 めるバイト は2です.
たちは のコードを してみてもいいです.
System.out.println((char)buff.get()+""+(char)buff.get());
:ヘ
これも しくないようです.コードを えたらいいです.
// System.out.println((char)buff.get()+""+(char)buff.get()
System.out.println((char)buff.get()+""+(char)buff.get()+""+(char)buff.get());
:position:0 limit:10
Exception in thread "main" java.nio.BufferUnderflowException
at java.nio.Buffer.nextGetIndex(Buffer.java:474)
at java.nio.HeapByteBuffer.get(HeapByteBuffer.java:117)
at com.taobao.moxing.notify.Main.main(Main.java:33)position:2 limit:10
position:2 limit:10
position:0 limit:2
なぜ を げたのですか? はlimitの でウィンドウがほしいからです. めるデータは のウィンドウで されています.もしこのウィンドウ の は めないなら、ここまであなたと はこれらのパラメータの が かりますよね.
reset としては、 のpositionを0に します.
rewindはmarkを-1にリセットし、positionを0にリセットします.
clear は にリセットして、mark=-1、position=0、limit=capacity(つまり のブザーの )を