Java NIO
NIO即New IO,同步非阻塞IO。这个库是在JDK1.4中才引入的。NIO和IO有相同的作用和目的,但实现方式不同,NIO主要用到的是块,所以NIO的效率要比IO高很多。在Java API中提供了两套NIO,一套是针对标准输入输出NIO,另一套就是网络编程NIO。
-
NIO和IO的区别
- IO是面向流的,而NIO是面向缓冲区的
- IO的各种流是阻塞的,而NIO是非阻塞的
- Java NIO的选择器允许一个单独的线程来监视多个输入通道
-
直接缓冲区和非直接缓冲区
直接缓冲区:通过allocateDirect()方法分配直接缓冲区,将缓冲区建立在物理内存中,可以提高效率
非直接缓冲区:通过allocate()方法分配直接缓冲区,将缓冲区建立在JVM的内存中
-
通道是什么
通道主要用于源节点与目标节点的连接。在Java NIO中负责缓冲区中数据的传输。Channel本身不存在数据,因此需要配合缓冲区进行传输
-
通道与流的区别
- 通道(Channel)既可以读取数据也可以写入数据,而流是单向的(如InputStream是输入流,OutputStream是输出流)
- 通道(Channel)不能直接访问数据,只能通过缓冲(Buffer)去访问
- 通道只在字节缓冲区操作(因为操作系统都是以字节的形式实现底层I/O接口的)
- 流,就像水流一样,单向,流过去了就不会回来;而通道如其名,双向,可来可去,可读可写。
-
通道有哪些实现类
java.nio.channels.Channel 接口
- java.nio.channels.ByteChannel
- ava.nio.channels.FileChannel
|–SocketChannel
|–ServerSocketChannel
|–DatagramChannel
-
通道的获取方式
java针对支持通道的类提供了getChannel()方法
本地io:
FileInputStreanm/FileOutputStream
RandomAccessFile
网络io:
Socket
ServerSocket
DatagramSocket -
分散与聚集
分散读取:是指从Channel中读取的数据“分散”到多个buffer中
聚集写入:是指多个buffer中的数据“聚集”到Channel中
-
字符集
编码:字符串–>字节数组
解码:字节数组–>字符串
-
同步和异步
同步就是在发出一个请求后,如果没有得到响应结果,该调用就不会返回,调用者会主动等待消息的返回。而异步就是当调用发出后,不会立刻得到结果,此时调用者就可以去做其他事。等到被调用者通过状态,再通过回调通知机制来通知调用者。
-
阻塞模式和非阻塞模式
阻塞模式就是客户端和服务端双方进行通信时,每来一个新的连接,就会新开一个线程来处理这个连接,之后的操作全部由这个线程完成。并且该线程在收到消息前会一直等待,即为阻塞。而非阻塞模式就是只有当收到消息时才会响应,不会一直等待。
-
NIO如何实现非阻塞IO
非阻塞 IO 的核心在于使用一个 Selector 来管理多个通道,可以是 SocketChannel,也可以是 ServerSocketChannel,将各个通道注册到 Selector 上并且指定监听的事件。之后可以只用一个线程来轮询这个 Selector,看看上面是否有通道是准备好的,当通道准备好可读或可写,然后才去开始真正的读写,这样就能够提高效率。