前面已经基本上介绍过buffer如何通过channel进行读写操作,这里要补充说明的是channel还能够读取写入多个buffer
- 注意这里说的读写对象是针对buffer而言,对channel而言则相反
-
通过channel写入数据到多个buffer(针对buffer而言是写入操作)
图片.png
//获取连接通道
FileChannel fileChannel = randomAccessFile.getChannel();
//初始化一个缓冲区,大小为1024byte
ByteBuffer buf01 = ByteBuffer.allocate(128);
ByteBuffer buf02 = ByteBuffer.allocate(1024);
ByteBuffer[] bufferArray = { buf01, buf02 };
fileChannel.read(bufferArray);
针对上面这段代码表示,channel中的数据会根据数组的顺序,先写到buf01中,当buf01写完128个字节后,仍然有数据则会继续写入buf02。这样可以为我们方便的将我们需要的数据隔离。
-
将通过channel读取多个buffer数据到channel(针对buffer是读取操作)
图片.png
//初始化一个缓冲区,大小为1024byte
ByteBuffer buf01 = ByteBuffer.allocate(128);
buf01.put((byte) 2);
ByteBuffer buf02 = ByteBuffer.allocate(1024);
buf01.put((byte) 122);
ByteBuffer[] bufferArray = { buf01, buf02 };
fileChannel.write(bufferArray);
同理针对上面的代码,channel会根据数组顺序读取buf01和buf02的可读数据,注意读取的数据量为buffer的限制大小,比如buf01只有一个字节大小,则只会读取一个字节的数据接着读取buf02的数据
FileChannel之间的转换
FileChannel可以直接将数据从一个通道传输到另一个通道。 操作这个是通过FileChannel类有中的transferTo()和transferFrom()方法。下面代码片段演示:
//源通道
RandomAccessFile fromFile = new RandomAccessFile("fromFile.txt", "rw");
FileChannel fromChannel = fromFile.getChannel();
//目标通道
RandomAccessFile toFile = new RandomAccessFile("toFile.txt", "rw");
FileChannel toChannel = toFile.getChannel();
long position = 0;
long count = fromChannel.size();
//transferFrom将源通道数据传入到目的通道中,position标记传输的起始位置,count表示传输的大小
toChannel.transferFrom(fromChannel, position, count);
//transferTo方法和上面的唯一区别,就是调用的对象不同(上面方法和下面两个处理等价)
fromChannel.transferTo(position, count, toChannel);
网友评论