NIO
问题1: 什么是NIO?
NIO,其实是在讨论一个IO的问题,就是数据以流的方式输入输出的事件,然后衍生出的BIO,NIO,AIO 就是只以一种什么样的方式去完成数据输出输入.
概念名词中文翻译(1)
BIO :同步阻塞
NIO:同步非阻塞
AIO: 异步非阻塞
概念名词关键字解释(2)
以上会出现两组名词:同步与异步,阻塞与非阻塞(以下解释是本人理解的,若有不准确可以留言斧正)
同步&异步:
发起调度任务的人,需不需要等待返回结果.
同步的话,我先等到一个返回结果后,再继续运行后面的代码. 若是异步的话,我触发了这个方法,不需要等待返回结果直接返回后面的代码
阻塞&非阻塞:
被调用方是不是马上返回结果
阻塞的话,被调用方接受到请求后,要等自己的方法(代码)完成后才返回结果.
非阻塞的话,被调用方马上返回数据表示自己的状态,不管是完成或者未完成.
总结:
上面章节,简单介绍了以及理清了一些关键字概念以及说明,再用大白话去总结BIO,NIO,AIO.
用A,B表示调用方以及被调用方.
BIO:A 调用 B的方法后,A要等待B返回预期结果后,A再继续执行本身的代码
NIO:A 调用 B的方法后,A接收了B返回的结果(不需要等待,且结果不一定是预期值,例如返回一些未完成的状态值),继续执行本身代码
AIO:A 调用 B的方法后,继续执行本身代码,B有结果了,会使用事件通知A
实战
如何把读文件/写文件?
本demo把读,写文件步骤糅合一起展示,显示简单的基本操作示范
//读入文件
RandomAccessFile infile = new RandomAccessFile("C:\\Users\\25245\\Desktop\\testInFile.txt","rw");
//读出文件
RandomAccessFile outfile = new RandomAccessFile("C:\\Users\\25245\\Desktop\\testOutFile.txt","rw");
//获取管道
FileChannel inChannel = infile.getChannel();
FileChannel outChannel = outfile.getChannel();
try {
//获取区块
ByteBuffer bigBuffer = ByteBuffer.allocate(1024*1024);
//读取数据
while(inChannel.read(bigBuffer) != -1){
//把读取的区块,游标位置反转,当需要从该区块中写出数据的话
bigBuffer.flip();
//判断区块中是否还有数据
while(bigBuffer.hasRemaining()){
//获取对应的一个字节
outChannel.write(bigBuffer);
}
bigBuffer.clear();
}
bigBuffer.clear();
}finally {
infile.close();
outfile.close();
inChannel.close();
outChannel.close();
}
}