一 基础知识
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 的实现
- FileChannel:从文件中读写数据
- DatagramChannel:通过UDP读写网络中的数据
- SocketChannel:通过TCP读写网络中的数据
- ServerSocketChannel:可以监听新进来的TCP连接,像 web 服务器一样,都每一个新进来的连接都会创建一个 SocketChannel
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 当中 |