IO相关介绍

1.分类

 java中的IO处理,现在有三类:

        BIO:同步并阻塞,服务器模式为一个连接一个线程。即客户端有连接请求是,服务器端就需要创建一个线程进行处理。

        NIO:同步非阻塞,服务器模式为一个请求一个线程。即客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到有连接请求时,才启动一个线程进行处理。

        AIO:异步非阻塞,服务器模式为一个有效请求一个线程。客户端的I/O请求由OS先完成,再通知服务器应用启动线程进行处理。

2.适用场景

        BIO:适用于连接数目比较小且固定的架构,对服务器资源要求比较高。<JDK1.4

        NIO:适用于连接数目比较多且比较短的架构。JDK1,4开始支持

        AIO:适用于连接数目比较多且比较长的架构。JDK1.7开始支持

3.重点讲解NIO

        原来的IO库和NIO重要的区别是数据打包和传输的方式。IO是以流的方式处理,一个流只能处理一个字节。IO是以块的方式处理数据,一次可以处理多个字节。

        其核心为:Channels, Buffers,Selectors

        写入操作时,不是将字节直接写入到通道,而是先写入到缓存中。同样读取操作,是将数据读取到缓存区,再从缓存区中取数据。通道模拟了原IO的流操作(单向)。提升是增加了缓存(双向)。Buffer有多种实现:ByteBuffer,CharBuffer,ShortBuffer,IntBuffer,LongBuffer,FloatBuffer,DoubleBuffer

        1>buffer工作原理:主要三个属性:position,limit,capacity

           

        buffer.flip()  该操作是将Buffer从写模式切换到读模式。即将position至首位,limit到原position的位置。

        buffer.clear()  该操作是将Buffer从读操作切换至写操作。即将position至首位,limit至capacity的位置。

        2>选择器

        NIO的选择器允许一个单独的线程监视多个输入通道。可以注册多个通道使用一个选择器。然后使用一个单独的线程来选择通道。从而减少了处理数据的线程数。

        Selector是异步IO的核心类,她能检测一个或多个通道上的事件,将事件分发出去。使用一个select线程就能检测多个通道上的事件,

         SelectionKey:包含了事件的状态信息和时间对应的通道绑定。

       3>附加文件拷贝代码        

public final class FileCopy {
	private FileCopy(){
		throw new AssertionError();
	}
	public static void filecopy(String source,String target)throws Exception{
		InputStream in=new FileInputStream(source);
		OutputStream out=new FileOutputStream(target);
		byte[] buffer=new byte[4096];
		int bytesToRead;
		while((bytesToRead=in.read(buffer))!=-1){
			out.write(buffer,0,bytesToRead);
		}
	}
	
	public static void filecopy2(String source ,String target)throws Exception{
		FileInputStream in=new FileInputStream(source);
		FileOutputStream out=new FileOutputStream(target);
		FileChannel inChannel=in.getChannel();
		FileChannel outChannel=out.getChannel();
		ByteBuffer buffer=ByteBuffer.allocate(4096);
		while (inChannel.read(buffer)!=-1) {
			buffer.flip();
			outChannel.read(buffer);
			buffer.clear();
		}
	}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值