阅读nio文档
This commit is contained in:
@@ -69,6 +69,94 @@ buffer的mark操作标识对buffer执行reset操作后position会被重置到的
|
|||||||
>
|
>
|
||||||
> 如果想要对buffer中的数据进行重新读取,可以调用`rewind()`方法,其将position设置为0,从而可以对[0, limit-1]范围内的数据重新进行读取。
|
> 如果想要对buffer中的数据进行重新读取,可以调用`rewind()`方法,其将position设置为0,从而可以对[0, limit-1]范围内的数据重新进行读取。
|
||||||
|
|
||||||
|
#### Buffer get/put方法
|
||||||
|
##### get
|
||||||
|
在ByteBuffer中,拥有如下`get`方法:
|
||||||
|
```java
|
||||||
|
byte get();
|
||||||
|
ByteBuffer get( byte dst[] );
|
||||||
|
ByteBuffer get( byte dst[], int offset, int length );
|
||||||
|
byte get( int index );
|
||||||
|
```
|
||||||
|
其中,前3个get方法都是relative方法,其基于当前position和limit来获取数据。第4个get方法则是absolute方法,其不基于position和limit,而是基于index绝对偏移量来获取数据。
|
||||||
|
|
||||||
|
> absolute get方法调用不基于position和limit,也不会对position和limit造成影响。
|
||||||
|
|
||||||
|
##### put
|
||||||
|
ByteBuffer拥有如下`put`方法:
|
||||||
|
```java
|
||||||
|
ByteBuffer put( byte b );
|
||||||
|
ByteBuffer put( byte src[] );
|
||||||
|
ByteBuffer put( byte src[], int offset, int length );
|
||||||
|
ByteBuffer put( ByteBuffer src );
|
||||||
|
ByteBuffer put( int index, byte b );
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Buffer allocation and warpping
|
||||||
|
在创建buffer之前,必须对buffer进行分配,
|
||||||
|
```java
|
||||||
|
ByteBuffer buffer = ByteBuffer.allocate(1024);
|
||||||
|
```
|
||||||
|
`Buffer.allocate`会创建一个指定大小的底层数组,并将数组封装到一个buffer对象中。
|
||||||
|
|
||||||
|
除了调用`allocate`之外,还可以将一个已经存在的数组分配给buffer:
|
||||||
|
```java
|
||||||
|
byte array[] = new byte[1024];
|
||||||
|
ByteBuffer buffer = ByteBuffer.wrap(array);
|
||||||
|
```
|
||||||
|
在调用`wrap`方法之后,会创建一个buffer对象,buffer对象对array进行的包装。此后,既可以通过array直接访问数组,也可以通过buffer访问数组。
|
||||||
|
|
||||||
|
#### Buffer slice
|
||||||
|
buffer slice会基于buffer对象创建一个sub buffer,新建的sub buffer会和原来的buffer共享部分的底层数组数据。
|
||||||
|
|
||||||
|
```java
|
||||||
|
ByteBuffer buffer = ByteBuffer.allocate(10);
|
||||||
|
|
||||||
|
for (int i = 0; i < buffer.capacity(); ++i) {
|
||||||
|
buffer.put((byte) i);
|
||||||
|
}
|
||||||
|
|
||||||
|
buffer.position(3);
|
||||||
|
buffer.limit(7);
|
||||||
|
|
||||||
|
ByteBuffer slice = buffer.slice();
|
||||||
|
```
|
||||||
|
通过上述方法,可以创建一个包含原始buffer[3,6]范围内元素的sub buffer。但是,sub buffer和buffer共享[3,6]范围内的数据,实例如下所示:
|
||||||
|
```java
|
||||||
|
// 将[3,6]范围内的元素都 * 11
|
||||||
|
for (int i = 0; i < slice.capacity(); ++i) {
|
||||||
|
byte b = slice.get(i);
|
||||||
|
b *= 11;
|
||||||
|
slice.put(i, b);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 重置original buffer的position和limit并读取数据
|
||||||
|
buffer.position(0);
|
||||||
|
buffer.limit(buffer.capacity());
|
||||||
|
while (buffer.remaining() > 0) {
|
||||||
|
System.out.println(buffer.get());
|
||||||
|
}
|
||||||
|
```
|
||||||
|
修改sub buffer中的元素内容后,访问original buffer中的内容,输出结果如下所示:
|
||||||
|
```shell
|
||||||
|
$ java SliceBuffer
|
||||||
|
0
|
||||||
|
1
|
||||||
|
2
|
||||||
|
33
|
||||||
|
44
|
||||||
|
55
|
||||||
|
66
|
||||||
|
7
|
||||||
|
8
|
||||||
|
9
|
||||||
|
```
|
||||||
|
易得知在sub buffer修改内容后,内容修改对buffer也可见。
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
### Channel
|
### Channel
|
||||||
Channel为一个对象,可以从channel中读取数据或向channel写入数据。将传统io和nio相比较,channel类似于stream。
|
Channel为一个对象,可以从channel中读取数据或向channel写入数据。将传统io和nio相比较,channel类似于stream。
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user