Java I/O(2):NIO中的Channel_java channel实现原理

createh52周前 (03-03)技术教程11

您好,我是湘王,这是我的头条号「湘王说」,欢迎您来,欢迎您再来~


为了解决标准Java I/O令人难以忍受的效率问题,从JDK1.4开始,NIO出现了(Non-blocking I/O,官方称之为New I/O)。NIO不但新增加了许多全新的类,而且还对原来的很多类进行了改写。之所以是NIO,是因为使用它的场景众多,譬如开发中必不可少的Tomcat,以及大名鼎鼎的Netty,而Netty更是把NIO发挥到了极致,成为了RPC技术事实上的标准,所以它在JDK1.7中又升级为了AIO(NIO2)。

NIO主要有三大核心部分:

  • Channel(通道)
  • Buffer(缓冲区)
  • Selector(选择器/多路复用器)

传统I/O基于字节流或字符流进行操作,而NIO基于新的Channel和Buffer进行操作。这是它们的比较:



至于原理,不用记,可以这么来理解(我始终秉持的态度是:如果你在大厂是自研类RPC系统或类MQ中间件的,那这个一定要精通;否则理解就好,不必死磕):

可以看到,I/O就像个直肠子,直来直去,对数据流完全是来者不拒,来多少接多少,也不管能不能处理得了,这样极容易造成线程阻塞,也就是电脑卡顿。

而NIO就有点弯弯绕了,它告诉线程:“如果我忙不过来就别等我,你先忙你的”。所以,按照这个约定,如果线程发现它不搭理自己的时候就会去忙别的。不会造成信息堵车。

Channel接口最重要的实现可以分为两大类:用于本地文件和用于网络的Channel。

  • FileChannel:用于本地文件数据的读写
  • DatagramChannel:用于网络UDP数据的读写
  • SocketChannel:客户端用于实现网络TCP数据的读写
  • ServerSocketChannel:服务端用于监听网络TCP的连接请求,每个请求会创建会一个SocketChannel(即客户端连接)

这是和Channel相关的继承结构图:



I/O本就枯燥,如果只是空洞说技术原理就更毫无价值,还是上代码,把NIO和IO比较一下。

创建一个普通的Java项目:




然后随便在网上或者自己电脑上找一个大文件,比如小电影之类的,写这样的代码:




然后再稍稍改进一下,看看byte[]相对于BufferedReader的不同:




最后再用NIO试试看:




在main()方法中分别执行这三个方法,看看耗时上有啥不同。尽量找很大的文件,比如几个G的那种。因为现在计算机的配置都比较高,文件太小,一会就读完了,根本看不出来差别。


另外,另外,在NIO中如果一个channel是FileChannel类型的,那么可以直接把FileChannel的数据传输到另一个Channel,就像这样:



SocketChannel、ServerSocketChannel和DatagramChannel的使用也比较简单,就不堆代码了。

Channel还提供了一种被称为Scatter/Gather(分散/聚集)的新功能(也称为Vectored I/O,矢量I/O),它在多个Buffer上实现一个简单的I/O操作。说人话就是:Scatter是把单个Channel的数据发给多个Buffer(分散),而Gather则是把多个Buffer的数据发给单个Channel(聚集),就像这样:



同样可以用代码来演示一下:



好了,NIO也属于Java中比较重要的内容,说多了容易搞晕。慢慢来~




感谢您抽空品鉴!技术、产品、运营和管理问题,可随时留言私信,欢迎骚扰~

我的头条主页

我在头条


相关文章

Java IO(一): I/O基础概念_java几种io

I/O基础概念1 Java I/O基础概念2 I/O流的概念3 Java I/O类层次结构3.1 字节流类3.2 字符流类3.3 流的使用3.4 示例代码4 总结大家好,我是欧阳方超,公众号同名。1...

Java 输入输出(I/O)详解_java oj输入输出

Java 输入输出(I/O)详解Java 提供了丰富的类库来处理输入输出操作。这些类主要位于 java.io 包中。以下是关于 Java I/O 的详细讲解,分为几个部分:文件 I/O、标准输入输出、...

10分钟看懂 Java IO 底层原理_java底层是用什么语言写的

来源:cnblogs.com/crazymakercircle/p/10225159.html前文我们提到了 Java I/O,顺着这个坡,我们进入 I/O 的世界吧,本来想尝试写点 I/O的底层东西...

Java I/O不迷茫,一文为你导航_java +i+

来源于公众号我没有三颗心脏 ,作者我没有三颗心脏前言在之前的面试中,每每问到关于Java I/O 方面的东西都感觉自己吃了大亏..所以这里抢救一下..来深入的了解一下在Java之中的 I/O 到底是怎...

深入理解JAVA I/O系列一:File_java file操作

I/O简介 I/O问题可以说是当今web应用中所面临的的主要问题之一,大部分的web应用系统的瓶颈都是I/O瓶颈。这个系列主要介绍JAVA的I/O类库基本架构、磁盘I/O工作机制、网络I/O工作机制以...

Java IO 中常用的目录和文件操作,用到的时候从这里拷贝就行了

文件是操作系统对磁盘上数据的组织形式。文件包括文件路径和文件名,比如:/Users/Calvin/Desktop/demo.txt 复制代码文件名的后缀其实是文件名的一部分,文件不一定要有后缀,但是一...