分散和聚集的理解
分散读取
是指从Channel中读取的数据“分散”到多个buffer中
![](https://i-blog.csdnimg.cn/blog_migrate/8a5016dccf9fcdab870726229132c7a5.png)
注:按照缓冲区的顺序,从Channel中读取的数据依次将buffer填满
代码实现如下
1 @Test
2 public void test5() throws Exception{
3 RandomAccessFile rw = new RandomAccessFile("src/test/java/1.txt", "rw");
4
5 // 获取通道
6 FileChannel channel = rw.getChannel();
7
8 // 分配指定大小的缓冲区
9 ByteBuffer buf1 = ByteBuffer.allocate(100);
10 ByteBuffer buf2 = ByteBuffer.allocate(1024);
11
12 // 分散读取
13 ByteBuffer[] bufs = {buf1, buf2};
14 channel.read(bufs);
15
16 // 切换为读模式
17 for (ByteBuffer byteBuffer : bufs) {
18 byteBuffer.flip();
19 }
20
21 System.out.println(new String(bufs[0].array(), 0, bufs[0].limit()));
22 System.out.println("-----------------------------");
23 System.out.println(new String(bufs[1].array(), 0, bufs[1].limit()));
24
25 }
聚集写入
是指将多个buffer中的数据“聚集”到Channel中。
![](https://i-blog.csdnimg.cn/blog_migrate/c256bb92b8b2c6a9e2029f267bd87808.png)
注:按照缓冲区的顺序,写入position和limit之间的数据到Channel中。
代码如下:
1 @Test
2 public void test5() throws Exception{
3 RandomAccessFile rw = new RandomAccessFile("src/test/java/1.txt", "rw");
4
5 // 获取通道
6 FileChannel channel = rw.getChannel();
7
8 // 分配指定大小的缓冲区
9 ByteBuffer buf1 = ByteBuffer.allocate(100);
10 ByteBuffer buf2 = ByteBuffer.allocate(1024);
11
12 // 分散读取
13 ByteBuffer[] bufs = {buf1, buf2};
14 channel.read(bufs);
15
16 // 切换为读模式
17 for (ByteBuffer byteBuffer : bufs) {
18 byteBuffer.flip();
19 }
20
21 System.out.println(new String(bufs[0].array(), 0, bufs[0].limit()));
22 System.out.println("-----------------------------");
23 System.out.println(new String(bufs[1].array(), 0, bufs[1].limit()));
24
25 // 聚集写入
26 RandomAccessFile rw1 = new RandomAccessFile("src/test/java/2.txt", "rw");
27 FileChannel channel1 = rw1.getChannel();
28 channel1.write(bufs);
29
30 }