From 19ce2bfe4f5e58fdcf23469a131b96f2e8929da8 Mon Sep 17 00:00:00 2001 From: asahi Date: Sat, 24 Aug 2024 21:51:54 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9Enio=E9=98=85=E8=AF=BB?= =?UTF-8?q?=E7=AC=94=E8=AE=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- java se/nio.md | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 java se/nio.md diff --git a/java se/nio.md b/java se/nio.md new file mode 100644 index 0000000..487c13f --- /dev/null +++ b/java se/nio.md @@ -0,0 +1,38 @@ +# NIO +## 简介 +nio库在jdk 1.4时被引入,和传统i/o不同的是,nio性能高且基于block。在nio中,定义了类来持有数据,并以block为单位对数据进行处理。 + +### nio和传统io区别 +nio和传统io最大的区别是数据打包和传输的方式。在传统io中,会以stream的形式来处理数据;而在nio中,数据则是以block的形式被处理。 + +面向stream的io系统在同一时刻只能处理1字节的数据,通常较慢。 + +面向block的io系统则是以block为单位处理数据,处理速度较传统io快。 + +## Channel/Buffer +channel和buffer是nio中的核心对象,几乎在每个io操作中被使用。 + +channel类似于传统io中的stream,所有数据的写入或读取都需要通过channel。而buffer本质上则是数据的容器,`所有被发送到channel中的数据都要先被放置到buffer中`,`所有从channel中读取的数据都要先被读取到buffer中`。 + +### Buffer +Buffer是一个类,用于存储数据,buffer中的数据要么将要被写入到Channel中,要么刚从Channel中读取出来。 + +> Buffer是nio和传统io的重要区别,在传统io中,数据直接从stream中被读取出来,也被直接写入到stream中。 +> +> 在nio中,数据的读取和写入都需要经过Buffer + +buffer的本质是一个字节数组,buffer提供了对数据的结构化访问,并且,buffer还追踪了系统的读/写操作。 + +#### Buffer类型 +最常用的Buffer类型是ByteBuffer,其支持对底层的字节数据进行set/get操作,初次之外,Buffer还有其他类型。 + +- ByteBuffer +- CharBuffer +- ShortBuffer +- IntBuffer +- LongBuffer +- FloatBuffer +- DoubleBuffer + +上述的每个Buffer类都实现了Buffer接口,除了ByteBuffer之外,其他每个Buffer类型都拥有相同的操作。由于ByteBuffer被绝大多数标准io操作锁使用,故而ByteBuffer除了拥有上述操作外,还拥有一些额外的操作。 +