简介:
分散读取(Scattering Reads):将通道中的数据分散到多个缓冲区中
聚集写入(Gathering Writes):将多个缓冲区中的数据聚集到通道中
一、操作示例
public void disperseAndGather() throws IOException{
RandomAccessFile raf1 = new RandomAccessFile("1.txt", "rw");
//1. 获取通道
FileChannel channel1 = raf1.getChannel();
//2. 分配指定大小的缓冲区
ByteBuffer buf1 = ByteBuffer.allocate(100);
//缓冲区二
ByteBuffer buf2 = ByteBuffer.allocate(1024);
//3. 分散读取
ByteBuffer[] bufs = {buf1, buf2};
channel1.read(bufs);
for (ByteBuffer byteBuffer : bufs) {
//切换缓冲区的读写模式
byteBuffer.flip();
}
System.out.println(new String(bufs[0].array(), 0, bufs[0].limit()));
System.out.println("--------分割线---------");
System.out.println(new String(bufs[1].array(), 0, bufs[1].limit()));
//4. 聚集写入
RandomAccessFile raf2 = new RandomAccessFile("2.txt", "rw");
FileChannel channel2 = raf2.getChannel();
//将读取内容写出
channel2.write(bufs);
}
扩展说明:
RandomAccessFile是个文本处理工具类,具有四个模式,分别是:
r | 以只读的方式打开文本,也就意味着不能用write来操作文件 |
rw | 读操作和写操作都是允许的 |
rws | 每当进行写操作,同步的刷新到磁盘,刷新内容和元数据 |
rwd | 每当进行写操作,同步的刷新到磁盘,刷新内容 |
部分方法说明:
方法 | 作用 |
seek(Long pos) | 指定文件的光标位置,通俗点说就是指定你的光标位置 然后下次读文件数据的时候从该位置读取。 |
getFilePointer() | 返回当前的文件光标位置。 |
length() | 获取文件的长度,返回long类型。 |
read() read(byte[] b) read(byte[] b,int off,int len) | 读取文件内容 |
readFully(byte[] b) | 将文本中的内容填满这个缓冲区b。 如果缓冲b不能被填满,那么读取流的过程将被阻塞,如果发现是流的结尾,那么会抛出异常。 |
getChannel | 获取通道 |
skipBytes(int n) | 跳过n字节的位置,相对于当前的point |