关于NIO中的分散与聚集

简介:

分散读取(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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值