一 基础知识

1.1 NIO简介

1、NIO是在Java1.4版本开始引入的一个全新的IO API,可以替代标准的Java io api
2、NIO和BIO有着相同的作用和目的,但是使用的方式完全不同,NIO支持面向缓冲区基于通道的IO操作
3、NIO将以更加高效的方式进行文件的读写操作

Java NIO 由3个核心部分组件组成:Channel,Buffer,Selector。虽然除了这三个之外还有很多其他的类和组件,但是这三者构成了核心的API。其他组件,如Pipe,FileLck,只不过是和这三个组件共同使用的工具类而已。

1.2 和BIO的区别

1、BIO是面向的,NIO面向缓冲区
2、BIO是阻塞IO,NIO是非阻塞IO

二 Channel

2.1 Channel概述

Channel就像是一个通道,可以通过它来读取和写入数据,他就像水管一样,网络数据通过Chanel来读取和写入。通道和流的不同就是在于通道是双向的,流只是在一个方向上移动(一个流必须是InputStream,或者OutputStream)而且通道而已用于读写或者同时用于读写,因为Channel是全双工的,所以他可以比流更好的映射底层操作系统的API。
NIO中通过Channel来封装了对数据源的操作,通过Channel我们可以操作数据源,但是又不必关系数据源的具体物理结构,这个数据源可能是多种的。比如,可以是文件,可以是网络Socket。在大多数应用中,channel与文件描述符或者Socket是一一对应的,Channel用于在字节缓存区和位于通道的另一侧的实体(通常是一个文件或者套接字)之间有效的传输数据

2.2 Channel实现

下面是 Java 中最重要的 Channel 的实现

  1. FileChannel:从文件中读写数据
  2. DatagramChannel:通过UDP读写网络中的数据
  3. SocketChannel:通过TCP读写网络中的数据
  4. ServerSocketChannel:可以监听新进来的TCP连接,像 web 服务器一样,都每一个新进来的连接都会创建一个 SocketChannel

这里就涵盖了 TCP,UDP,文件IO的实现

2.3 FileChannel实例

FileChannel类可以实现常用的 read,write 以及 scatter,gatter 操作。同时他也提供了很多专用于文件的新方法。这些方法中的很多都是我们熟悉的文件操作。

方法 描述
int read(ByteBuffer dst) 从 channel 中读取数据到 ByteBuffer
long read(ByteBuffer[] dsts) 将 Channel 中的数据分散到 ByteBuffer[]
int write(ByteBuffer src) 将 ByteBuffer 中的数据写入到 Channel 中
int write(ByteBuffer[] srcs) 将 ByteBuffer[] 中的数据聚集到 Channel 当中

三 Buffer

四 Selector

五 Pipe和FileLock

六 其他

七 聊天室