摘要:
NIO是New I/O的简称,在java1.4被纳入到JDK,和旧的基于流的 I/O相对,他以块为基本处理单位,有以下特性:
- 基于块
- 为所有原始类型提供缓存支持
- 增加通道对象作为新的初始I/O抽象
- 支持文件锁和内存映射文件的文件访问接口,文件锁就是.log文件,当文件存在就是有线程在使用,线程执行完之后删除文件。内存映射文件就是把文件读入内存。
- 提供了基于Selector的异步网络I/O
NIO文件复制:
1 | public static void nioCopyFile(String resource,String destination) throws IOException{ |
buffer有几个位置capacity limit position
类型 | capacity | limit | position |
---|---|---|---|
read模式 | 总容量大小,上面是1k | 可读取实际大小 | 当前缓冲区读取的位置,只读取此位置之后的 |
write模式 | 总容量大小,上面是1k | 小于等于总容量 | 当前缓冲区从什么位置开始写,从此位置下一个位置写 |
在执行buffer.flip()会将limit从capacity位置拉回到此次实际读取到的大小的位置,而position会放回到开头0号位对buffer的写转换到读时通常要用
文件映射到内存
1 | public static void fileToMemory() throws IOException{ |
网络编程-NIO
传统的多个客户端请求服务器数据,首先会经过一个分发,然后到后台业务,这样通常每一个请求服务端会新建立一个线程去对应,但是这样如果网络不佳,这些线程都会被阻塞,造成性能低下,那么有没有办法一个线程能够对应多个客户端请求呢,那就要说到NIO的select。select通常为一个单独的线程,他同时轮询多个等待数据的channel(channel类似于流,一个channel可以和文件或者socket对应),如果都没准备好就阻塞,如果有数据就返回,这样就基本上减轻了上述问题。
老式socket做法:
1 |
总结
- NIO有select和selectnow方法,前者使用广,没有数据返回就阻塞,后者是无阻塞的,没有数据也直接返回。
- NIO会将数据准备好之后,由应用处理,数据的读取过程依然在应用线程中
- NIO的selector可以复用,所以节省数据准备时间
网络编程-AIO
特点:
读完之后通知
不会加快IO
使用回调函数进行业务处理