java NIO

简介: 传统的io叫BIO,Blocked Input Output。 NIO,Non-Blocked Input Output。1.同BIO的比较 1.1 阻塞与非阻塞 BIO的各种流是阻塞的。这意味着,当一个线程调用read() 或 write()时,该线程被阻塞,直到有一些数据被读取,或数据完全写入。1.2 单向与双向 BIO的操作通常是单向的,即一个流必须是InputStrea
传统的io叫BIO,Blocked Input Output。
NIO,Non-Blocked Input Output。

1.同BIO的比较

1.1 阻塞与非阻塞

BIO的各种流是阻塞的。这意味着,当一个线程调用 read() 或 write()时,该线程被阻塞,直到有一些数据被读取,或数据完全写入。

1.2 单向与双向

BIO的操作通常是单向的,即一个流必须是 InputStreamOutputStream的子类,只能单向处理。
NIO的channel,可以双向读写。所以它比stream可以更好地映射底层操作系统的API。特别是在linux OS中,网络编程的底层通道都是全双工的。

2.Channel

java.nio.channels.Channel

channel是一个通道,通过它可以读取和写入数据。

FileChannel 从文件中读写数据。

DatagramChannel 能通过UDP读写网络中的数据。
SocketChannel 能通过TCP读写网络中的数据。

ServerSocketChannel可以监听新进来的TCP连接,像Web服务器那样。对每一个新进来的连接都会创建一个SocketChannel。

3.selector

java.nio.channels.Selector

多路复用器。

它会不断轮询注册在其上的channel,如果某个channel有新的事件(如建立新连接、读事件、写事件),这个channel就处于就绪状态,会被selector轮询出来。然后通过selectionKey可以获取就绪的Channel的集合,进行后续的IO操作。

只需一个线程负责selector轮询,就可以接入成千上万的客户端,这比以前是个非常大的进步。

Selector java.nio.channels.Selector.open()
打开一个selector。
SelectionKey java.nio.channels.SelectableChannel.register(Selector sel, int ops) 
向Selector注册此channel。
SelectableChannel java.nio.channels.SelectionKey.channel()
返回这个SelectionKey对应的channel。
boolean java.nio.channels.SelectionKey.isReadable()
对应的channel是否可读。

int java.nio.channels.Selector.select() 

同步函数。当注册在其上的若干个channel有IO就绪动作时,得到返回。

4.SocketChannel

跟TCP通信相关的channel。

4.1 server

java.nio.channels.ServerSocketChannel
就是ServerSocketChannel。
ServerSocketChannel java.nio.channels.ServerSocketChannel.open()
拿到ServerSocketChannel,起到作构造函数的效果。
ServerSocket java.nio.channels.ServerSocketChannel.socket()
获取ServerSocket。
void java.net.ServerSocket.bind(SocketAddress endpoint)
绑定端口。
SocketChannel java.nio.channels.ServerSocketChannel.accept() 
监听socket收到链接请求,返回一个通信socket。

4.2 client

SocketChannel java.nio.channels.SocketChannel. open(SocketAddress remote)
客户端链接远程端口。

4.3 通信部分

int java.nio.channels.SocketChannel.write(ByteBuffer src)
将src的内容写入channel里。
int java.nio.channels.SocketChannel.read(ByteBuffer dst)
将channel的数据写入dst中。

5.ByteBuffer

java.nio.ByteBuffer

nio中很常见的一个类,用于缓冲字节。
ByteBuffer java.nio.ByteBuffer.allocate(int capacity)
拿到ByteBuffer。初始时,limit为capacity,position为0。
ByteBuffer java.nio.ByteBuffer.put(byte[] src)
将src内容放入自身。

byte[] java.nio.ByteBuffer.array()

以byte数组的形式返回自身内容。
Buffer java.nio.Buffer.flip()

常用于读写模式的反转。

5.1 图解flip

图5-1 put。写模式下,往buffer里写一个字节,并把postion移动一位。写模式下,一般limit与capacity相等。

图5-2 flip。写完数据,需要开始读的时候,将postion复位到0,并将limit设为当前postion。

目录
相关文章
|
29天前
|
存储 Java 数据处理
|
1月前
|
Java API
java中IO与NIO有什么不同
java中IO与NIO有什么不同
|
2月前
|
移动开发 编解码 网络协议
用Java的BIO和NIO、Netty来实现HTTP服务器(三) 用Netty实现
用Java的BIO和NIO、Netty来实现HTTP服务器(三) 用Netty实现
|
2月前
|
网络协议 Java Linux
用Java来实现BIO和NIO模型的HTTP服务器(二) NIO的实现
用Java来实现BIO和NIO模型的HTTP服务器(二) NIO的实现
|
2月前
|
编解码 网络协议 Java
用Java的BIO和NIO、Netty实现HTTP服务器(一) BIO与绪论
用Java的BIO和NIO、Netty实现HTTP服务器(一) BIO与绪论
|
3月前
|
Java 应用服务中间件 Linux
java中的NIO,BIO,AIO
java中的NIO,BIO,AIO
16 0
|
3月前
|
设计模式 网络协议 Java
Java NIO 网络编程 | Netty前期知识(二)
Java NIO 网络编程 | Netty前期知识(二)
73 0
|
3月前
|
Java 索引
📌 Java NIO Buffer
Java NIO缓冲区在与NIO通道交互时使用。数据从通道读取到缓冲区,然后从缓冲区写入通道。 缓冲区本质上是一块内存,可以在其中写入数据,然后再进行读取。这个内存块被封装在一个NIOBuffer对象中,该对象提供了一组方法,可以更容易地使用内存块。
|
3月前
|
缓存 网络协议 Java
📌 Java NIO Channel
Java NIOChannel和传统的流相似,但是也存在一些差异: • 在同一个Channel通道中,既可以进行 读操作 也可以进行 写操作,但是 流 只能进行 读 或者 写 其中一种操作。 • Channel通道可以进行异步读写。 • Channel可以从 Buffer中进行读写操作。将数据从Channel通道读取到Buffer缓冲区,并将数据从Buffer缓冲区写入Channel通道。
|
3月前
|
Java API 容器
📌 Java NIO
Java NIO(New IO或 Non Blocking IO)是从Java 1.4版本开始引入的一个新的IOAPI,可以替代标准的Java IO API。NIO支持面向缓冲区的、基于通道的IO操作。NIO将以更加高效的方式进行文件的读写操作。(NIO非阻塞 IO操作)。Java NIO包含了如下三个核心组件:Channel、Buffers、Selectors。