发展史
按照使用的 IO 模型,大致可以分为三类:
- BIO:JDK1.4 之前的阻塞 IO
- NIO:JDK1.4 及以后的版本,非阻塞 IO
- AIO:JDK1.7 之后,又叫 NIO.2,异步 IO
IO 总的来说分为两个阶段,第一阶段是等待数据到达内核缓冲区,第二阶段是将数据从内核缓冲区复制到用户缓冲区。
Java NIO
Java NIO 是 java 1.4, 之后新出的一套IO接口NIO中的N可以理解为Non-blocking,不单纯是New。
NIO的特性/NIO与IO区别
1)IO是面向流的,NIO是面向缓冲区的;
2)IO流是阻塞的,NIO流是不阻塞的;
3)NIO有选择器,而IO没有。
读数据和写数据方式
-
从通道进行数据读取 :创建一个缓冲区,然后请求通道读取数据。
-
从通道进行数据写入 :创建一个缓冲区,填充数据,并要求通道写入数据。
NIO核心组件简单介绍
Java NIO的三大核心组件是Channel(通道)、Buffer(缓冲区)、Selector(选择器)。其中,通道和缓冲区的联系比较密切:数据总是从通道读到缓冲区内,或者从缓冲区写入通道中。
Java NIO里关键的Buffer实现
- ByteBuffer
- CharBuffer
- DoubleBuffer
- FloatBuffer
- IntBuffer
- LongBuffer
- ShortBuffer
例子
package com.sto.nio;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
/**
* @author yanyugang
* @description
* 实例说明:实现文件复制功能
* 实现方式:通道FileChannel、 缓冲区ByteBuffer
* @date 2019-09-12 15:15
*/
public class NioTest {
public static void main(String[] args) throws IOException{
// 设置输入源 & 输出地 = 文件
String infile="d:/knowledge.txt";
String outfile="d:/hello.txt";
// 1. 获取数据源 和 目标传输地的输入输出流(此处以数据源 = 文件为例)
FileInputStream fin=new FileInputStream(infile);
FileOutputStream fout=new FileOutputStream(outfile);
// 2. 获取数据源的输入输出通道
FileChannel fcin=fin.getChannel();
FileChannel fcout=fout.getChannel();
// 3. 创建缓冲区对象
ByteBuffer buff=ByteBuffer.allocate(1024);
while (true) {
// 4. 从通道读取数据 & 写入到缓冲区
// 注:若 以读取到该通道数据的末尾,则返回-1
int r=fcin.read(buff);
if (r==-1){
break;
}
// 5. 传出数据准备:调用flip()方法
buff.flip();
// 6. 从 Buffer 中读取数据 & 传出数据到通道
fcout.write(buff);
// 7. 重置缓冲区
buff.clear();
}
}
}