当前位置: 首页 > 后端技术 > Java

【Java基础】NIO初步认识

时间:2023-04-01 18:45:02 Java

NIO(Non-blockingI/O,在Java领域,又称为NewI/O),是一种同步非阻塞I/O模型,也是一种I/O多通道复用的基础。那和普通的IO有什么区别呢?一、概述NIO是从Java1.4开始引入的一种新的IOAPI。NIO支持面向缓冲区、基于通道的IO操作。原始IO是阻塞IO,与NIO比较:IONIO是面向流,面向缓冲区,阻塞IO,非阻塞IO,无选择器1,面向流和面向缓冲区,面向流是读一个或一个每次从流中获取更多字节。直到读完为止。只是阅读它并放手。面向缓冲区就是先把数据放在缓冲区中,需要读取的时候再从缓冲区中取出。读取后缓冲区数据还在,移动指针即可读取缓冲区中的不同数据。2.阻塞/非阻塞阻塞就是在不读写数据的时候,也占用线程,不能干别的事情。非阻塞意味着线程在不读或不写的时候可以做其他事情。3.选择器允许一个线程管理多个输入通道。使用场景:NIO:需要管理同时打开的多个连接(比如聊天服务器),并且连接每次只发送少量数据。IO:连接数少,每次发送大量数据数据处理过程:阻塞IONIO2.NIO基础Buffer和Channel是标准NIO中的核心对象。Channel是对原始IO中流的模拟。任何源数据和目标数据都必须通过一个Channel对象Buffer,它本质上是一个容器对象。所有发送到Channel的对象都要先放到Buffer中;同样,从Channel读取任何数据都必须读入Buffer。a)关于Buffer一个Buffer包含一些要写入或读取的数据。在NIO中,所有的数据都是通过Buffer来处理的,Buffer是NIO读写数据的中转池。Buffer本质上是一个数组,提供对数据的结构化访问。使用Buffer读写数据一般有以下四个步骤:将数据写入Buffer;调用flip()方法从写入模式转换为读取模式;从缓冲区读取数据;调用clear()方法(清除);或compact()方法(清除读取数据)。2)关于Channel,可以通过Channel读写数据。将其视为IO中的流。但是它和流之间有一些区别。Channel是双向的,可以读写,而stream是单向的。Channel可以异步读写。对Channel的读写必须通过缓冲区对象来完成。会从一个文件中读取数据并写入到另一个文件中,代码如下nio.channels.FileChannel;公共类CopyFileUseNIO{publicstaticvoidmain(String[]args)throwsIOException{Stringsrc="/xxxx/LICENSE.txt";Stringdst="/xxxx/LICENSE-COPY.txt";FileInputStreamfi=newFileInputStream(src);FileOutputStreamfo=newFileOutputStream(dst);//获取传输通道channelFileChannelinChannel=fi.getChannel();FileChanneloutChannel=fo.getChannel();//获取容器缓冲区ByteBufferbuffer=ByteBuffer.allocate(1024);while(true){//判断是否读取文件inteof=inChannel.read(buffer);//#1if(eof==-1){break;}//重置缓冲区position=0,limit=positionbuffer.flip();//#2//开始写outChannel.write(缓冲区);//#3//写入后重置buffer,重置position=0,limit=capacitybuffer.clear();//#4}inChannel.close();outChannel.close();fi.close();fo.close();}}注意#1~#4上面的评论。四个位置代码执行后的缓冲区数据如下。参考下面的内容可以帮助你更好的理解,几个操作都做了什么。当然也可以直接看源码,非常简洁易懂:(比如clear的操作逻辑)publicfinalBufferclear(){position=0;限制=容量;标记=-1;归还这个;}4.小结本节对NIO做了简单的介绍。相对于原来的IO,介绍了NIO的读写过程,并对NIObuffer和channel的重要概念进行了说明。所有的数据都要经过buffer处理,而channel只是一个连接的pipeline,不能直接从channel中获取数据。NIO有一个非阻塞特性,当读写没有完成时,不会继续阻塞线程。不读写的时候,线程可以处理其他事情。最后提供一个读写数据的demo,帮助理解。参考文章:Java常见面试题JavaNIO分析总结------------Java基础(NIO和IO的区别)JavaNIO详解(一)