nio ScatterAndGather的API(二)

package Demo2;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;


public class ScatterAndGather {
	
	private static String filePath = "D:\\2.txt";
	
	public static void main(String[] args) {
		Scatter();
		Gather();
	}
	//一个通道写入到多个缓冲区
	public static void Scatter()
	{
		try {
			RandomAccessFile afile = new RandomAccessFile(filePath, "rw");
			
			FileChannel channel = afile.getChannel();
			
			ByteBuffer headBuf = ByteBuffer.allocate(10);
			ByteBuffer bodyBuf = ByteBuffer.allocate(20);
			
			ByteBuffer[] bArray = new ByteBuffer[]{headBuf,bodyBuf};
			
			try {
				long n = channel.read(bArray);
				System.out.println("从通道里读出到多个字节:"+n);
				
				//为什么不是从第一个开始读20个字节?
				//注意buffer首先被插入到数组,然后再将数组作为channel.read() 的输入参数。
				//read()方法按照buffer在数组中的顺序将从channel中读取的数据写入到buffer,
				//当一个buffer被写满后,channel紧接着向另一个buffer中写。

				//Scattering Reads在移动下一个buffer前,必须填满当前的buffer,这也意味着它
				//不适用于动态消息(译者注:消息大小不固定)。换句话说,如果存在消息头和消息体,消息头必须
				//完成填充(例如 128byte),Scattering Reads才能正常工作。
				bodyBuf.flip();				
				while(bodyBuf.hasRemaining())
				{
					System.out.print((char)bodyBuf.get()+"-------");
				}			
				
				headBuf.flip();
				while(headBuf.hasRemaining())
				{
					System.out.print((char)headBuf.get()+"======");
				}
				System.out.println();
		
				
			/*	while(n != 0)
				{
					headBuf.flip();
					while(headBuf.hasRemaining())
					{
						System.out.print((char)headBuf.get()+"======");
					}
					System.out.println();
					bodyBuf.flip();
					while(bodyBuf.hasRemaining())
					{
						System.out.print((char)bodyBuf.get()+"-------");
					}
				}
				为什么不需要外层的条件呢?
				*/
				
				headBuf.clear();
				bodyBuf.clear();
				
				afile.close();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}
	//多个buffer写入同一个通道
	//buffers数组是write()方法的入参,write()方法会按照buffer在数组中的顺序,
	//将数据写入到channel,注意只有position和limit之间的数据才会被写入。因此,如
	//果一个buffer的容量为128byte,但是仅仅包含58byte的数据,那么这58byte的数据
	//将被写入到channel中。因此与Scattering Reads相反,Gathering Writes能较好的处理动态消息。
	public static void Gather()
	{
		try {
			RandomAccessFile aFile = new RandomAccessFile(filePath, "rw");
			
			FileChannel channel = aFile.getChannel();
			
			ByteBuffer header = ByteBuffer.allocate(128);
			ByteBuffer body = ByteBuffer.allocate(1024);
			
			ByteBuffer[] bArray = new ByteBuffer[]{header,body};
			
			try {
				//从多个缓冲区写进通道
				long n = channel.write(bArray);
				System.out.println("多个缓冲区写入通道的size:"+n);
				header.flip();
				body.flip();
				while(header.hasRemaining())
				{
					System.out.print((char)header.get()+"==");
				}
				while (body.hasRemaining()) {
					System.out.print((char)body.get()+"--");
				}
				header.clear();
				body.clear();
				aFile.close();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值