NIO

NIO


一、NIO:

JDK1.4版本开始,JDK提供了新的IO操作API NIO提高了效率,其主要有三大核心组件:ChannelBufferSelector,这里重点整理前两个

二、Buffer

Buffer是一个抽象类Buffer类型变量对应的对象代表一块缓冲区ByteBufferCharBufferDoubleBufferFloatBufferIntBufferLongBufferShortBuffer类都是Buffer抽象类的子类,其中ByteBuffer最常用。

ByteBuffer常用的方法:

1.static ByteBuffer allocate(int capacity):分配一个新的字节缓冲区。

2.int capacity()返回此缓冲区的容量。

3.ByteBuffer put(byte b):将字节类型数据写入当前位置的缓冲区,然后当前位置+1,位置从0开始。

4.byte[] array() :将ByteBuffer类型的数据转为byte数组。

5.int position():返回缓冲区当前位置。

6.Buffer flip() ):翻转缓冲区,将position置零。

7.boolean hasRemaining():判断缓冲区是否含有数据 。

8.byte get()读取缓冲区当前位置的字节,然后当前位置+1

9.Buffer clear():清除缓冲区,位置归零。

示例:

public class Test {
	
	public static void main(String[] args) {
		
		ByteBuffer byteBuffer = ByteBuffer.allocate(1024);//开辟一个字节缓存区
		System.out.println(byteBuffer.capacity());//得到缓存区的容量,打印结果为1024
		
		byte b = 2;
		byteBuffer.put(b);//将字节类型数据写入当前位置的缓冲区,然后当前位置+1,位置从0开始。
		System.out.println(byteBuffer.position()+",position从0+1");//int position():返回缓冲区当前位置;打印结果为:1,position从0+1
		
		byteBuffer.flip();//position置零
		System.out.println(byteBuffer.position()+",position置零");//打印结果为:0,position置零
		
		System.out.println(byteBuffer.get());//得打缓冲区当前位置的字节,position+1;打印结果:2
		System.out.println(byteBuffer.position());//position确实加1,打印结果:1
		
		byteBuffer.clear();//清除缓冲区,位置归零,但是不会清空缓存中的数据
		System.out.println(byteBuffer.get());//依然可以得到数据,打印结果:2
		
		//boolean hasRemaining(),判断position是否已经到达极限limit,如果position<limit则是true,否则是false,极限limit=byteBuffer.capacity(),在这里limit=1024
		ByteBuffer byteBuffer2 = ByteBuffer.allocate(1024);
		for (int i = 0; i < 1024; i++) {
			System.out.println(byteBuffer2.put(b)+":"+i+":"+byteBuffer2.position()+byteBuffer2.hasRemaining());
		}
	
		//将ByteBuffer类型的数据转为byte数组
		byte [] array = byteBuffer2.array();
		for (byte c : array) {
			System.out.println(c);
		}
	}
}

三、Channel

Channel是一个接口,该接口类型变量指向的对象代表一个数据传输通道,Channel对象是面向缓冲区的:数据总是从通道读取到缓冲区(Buffer类型对象),或从缓冲区(Buffer类型对象)写入到通道中

Channel接口主要实现类如下:

1.FileChannel:从文件中读写数据。

2.DatagramChannel通过UDP读写网络中的数据。

3.SocketChannel通过TCP读写网络中的数据。

4.ServerSocketChannel:可以监听新进来的TCP连接,像Web服务器那样,对每一个新进来的连接都会创建一个SocketChannel

 

这里主要对FileChannel举例说明,示例如下

public class Test {
	
	public static void main(String[] args) {
		
		try {
			FileInputStream fileInputStream = new FileInputStream("I:\\1.txt");
			FileChannel inputChannel = fileInputStream.getChannel();//FileChannel:从文件中读写数据。将数据读到通道中
			
			FileOutputStream fileOutputStream = new FileOutputStream("I:\\6.txt");
			FileChannel outputChannel = fileOutputStream.getChannel();
			
			ByteBuffer byteBuffer = ByteBuffer.allocate(1024);
		
			while((inputChannel.read(byteBuffer))!=-1) {//int read(ByteBuffer dst):从通道的当前位置,将数据读取打到缓冲区,如果已达到通道末尾, 则返回-1 
				byteBuffer.flip();//position置为零
				outputChannel.write(byteBuffer);//int write(ByteBuffer dst):从通道的当前文件位置将缓冲区中的数据写入通道
				byteBuffer.clear();//并不会清空数据
			}
		} catch (Exception e) {
			e.printStackTrace();
		} 
	}
}

将数据输到控制台上:

public class Test {
	
	public static void main(String[] args) {

		try {
			FileInputStream fileInputStream = new FileInputStream("I:\\兴唐\\1、Spring.avi");
			FileChannel  fileChannel = fileInputStream.getChannel();
			
			ByteBuffer byteBuffer = ByteBuffer.allocate(1024);
			while (fileChannel.read(byteBuffer)!=-1) {//将数据读到缓冲区,到达文件末尾返回-1
				System.out.println(byteBuffer.position());
				String result = new String(byteBuffer.array(),0,byteBuffer.position());//将数据输出到控制台上
				System.out.println(result);
				byteBuffer.clear();
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值