新IO系统基于两个最简单的项目:通道和缓存区。通道代表对一个IO源或目标的开放式连接,缓存区存放可操作的数据,NIO是异步非阻塞式调用io系统
同步、异步、阻塞、非阻塞
同步是一个连接一个线程,而异步是一个请求一个线程,阻塞是当读取不到数据时线程会等待,非阻塞是线程发出数据请求后转而向下执行,当数据加载好时通知线程
NIO基础
fileinputstream f = new FileInputStream(".txt")//
FileChannel fchan = f.getchannel();//建立通道
int fsize = fchan.size();
bytebuffer fb = bytebuffer.allocate(fsize);//建立缓存区
fchan.read(fb);//将数据读取到缓存区
NIO和IO的区别
1、IO是面向流的,从流中读取,没有缓存区不能操作;NIO是面向缓存的,在缓存中可以进行数据处理
2、IO中的流是阻塞的,当进行read或write时,线程将不能执行直到读取全部数据, NIO的非阻塞模式,使一个线程从某通道发送请求读取数据,但是它仅能得到目前可用的数据,如果目前没有数据可用时,就什么都不会获取。而不是保持线程阻塞,所以直至数据变的可以读取之前,该线程可以继续做其他的事情。 非阻塞写也是如此。一个线程请求写入一些数据到某通道,但不需要等待它完全写入,这个线程同时可以去做别的事情。 线程通常将非阻塞IO的空闲时间用于在其它通道上执行IO操作,所以一个单独的线程现在可以管理多个输入和输出通道(channel)。
3、通道类似于流,但可以双向操作
4、选择器(Selectors)Java NIO的选择器允许一个单独的线程来监视多个输入通道,你可以注册多个通道使用一个选择器,然后使用一个单独的线程来“选择”通道:这些通道里已经有可以处理的输入,或者选择已准备写入的通道。这种选择机制,使得一个单独的线程很容易来管理多个通道。
5、当连接多而带宽小时用NIO,当连接少但带宽大时用IO