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(); } } }