阅读nio文档

This commit is contained in:
asahi
2024-08-26 12:53:12 +08:00
parent 3c3ab1f41e
commit c0f21f27b0

View File

@@ -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。