专栏首页阿林前端开发攻城狮按照缓冲区的顺序,分散读取和非阻塞式网络通信区别
原创

按照缓冲区的顺序,分散读取和非阻塞式网络通信区别

分散读取

分散读取(Scattering Reads)是指从Channel 中读取的数据“分散”到多个Buffer 中。

注意:按照缓冲区的顺序,从Channel 中读取的数据依次将 Buffer 填满。

聚集写入

聚集写入(Gathering Writes)是指将多个Buffer 中的数据“聚集”到Channel。

按照缓冲区的顺序,写入position 和limit 之间的数据到Channel。

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;

public class demo6 {
    public static void main(String[] args) throws IOException {
        FileInputStream is = new FileInputStream("");
        FileOutputStream os = new FileOutputStream("");

        FileChannel inChannel = is.getChannel();
        FileChannel outChannel = os.getChannel();

        // 获得多个缓冲区,并且放入到缓冲区数组中
        ByteBuffer byteBuffer1 = ByteBuffer.allocate(50);
        ByteBuffer byteBuffer2 = ByteBuffer.allocate(1024);
        ByteBuffer[] byteBuffers = {byteBuffer1, byteBuffer2};

        // 分散读取
        inChannel.read(byteBuffers);

        byteBuffer1.flip();
        byteBuffer2.flip();

        // 聚集写入
        outChannel.write(byteBuffers);
    }
}

非阻塞式网络通信

概念

比喻:

举个你去饭堂吃饭的例⼦,你好⽐⽤户程序,饭堂好⽐操作系统。

阻塞 I/O 好⽐,
你去饭堂吃饭,但是饭堂的菜还没做好,然后你就⼀直在那⾥等啊等,

等了好⻓⼀段时间终于等到饭堂阿姨把菜端了出来(数据准备的过程),

但是你还得继续等阿姨把菜(内核空间)打到你的饭盒⾥(⽤户空间),

经历完这两个过程,你才可以离开。



⾮阻塞 I/O 好⽐,
你去了饭堂,问阿姨菜做好了没有,阿姨告诉你没,

你就离开了,过⼏⼗分钟,你⼜来,

饭堂问阿姨,阿姨说做好了,于是阿姨帮你把菜打到你的饭盒⾥,这个过程你是得等待的。




基于⾮阻塞的 I/O 多路复⽤好⽐,
你去饭堂吃饭,发现有⼀排窗⼝,饭堂阿姨告诉你这些窗⼝都还没做好菜,

等做好了再通知你,于是等啊等( select 调⽤中),过了⼀会阿姨通知你菜做好了,

但是不知道哪个窗⼝的菜做好了,你⾃⼰看吧。

于是你只能⼀个⼀个窗⼝去确认,后⾯发现 5 号窗⼝菜做好了,

于是你让 5 号窗⼝的阿姨帮你打菜到饭盒⾥,这个打菜的过程你是要等待的,虽然时间不⻓。

打完菜后,你⾃然就可以离开了。



异步 I/O 好⽐,
你让饭堂阿姨将菜做好并把菜打到饭盒⾥后,把饭盒送到你⾯前,整个过程你都不需要任何等待。

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 经典面试题-2020年大厂面试题锦集

    高可靠分布式存储模型 在 Kafka 中保证高可靠模型依靠的是副本机制,有了副本机制之后,就算机器宕机也不会发生数据丢失

    cwl_java
  • Java IO与NIO

    七 Java NIO AsynchronousFileChannel异步文件通

    后端码匠
  • JDK10都发布了,nio你了解多少?

    Java3y
  • Java.NIO编程一览笔录

    Java标准IO 与 Java NIO 的简单差异示意: Java标准IO Java NIO API调用 简单 复杂 底层实现 面向流(str...

    斯武丶风晴
  • NIO前言:一、NIO与IO的区别二、通道和缓冲区三、NIO的网络通信总结:

    所谓NIO,就是New IO的缩写。是从JDK 1.4开始引入的全新的IO API。NIO将以更高效的方式进行文件的读写操作,可完全代替传统的IO API使用。...

    贪挽懒月
  • 周末复习 Android & Java 面试题

    当应用启动时,后台没有该应用的进程,这时系统会重新创建一个新的进程分配给该应用,这个启动方式就叫做冷启动((后台不存在该应用进程)

    陈宇明
  • NIO 之 Channel实现原理

    java404
  • 高性能服务器程序框架

    http://blog.csdn.net/zs634134578/article/details/19806429

    bear_fish
  • Kafka性能篇:为何这么“快”?

    以讲解性能作为 Kafka 之旅的开篇之作,让我们一起来深入了解 Kafka “快”的内部秘密。你不仅可以学习到 Kafka 性能优化的各种手段,也可以提炼出各...

    范蠡
  • Kafka性能篇:为何Kafka这么"快"?

    以讲解性能作为 Kafka 之旅的开篇之作,让我们一起来深入了解 Kafka “快”的内部秘密。你不仅可以学习到 Kafka 性能优化的各种手段,也可以提炼出各...

    捡田螺的小男孩
  • Kafka性能篇:为何Kafka这么"快"?

    以讲解性能作为 Kafka 之旅的开篇之作,让我们一起来深入了解 Kafka “快”的内部秘密。你不仅可以学习到 Kafka 性能优化的各种手段,也可以提炼出各...

    PHP开发工程师
  • Java知识点——NIO和BIO

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jvUiQgVM-1584882587306)(img/NIO图例.png)]

    用户7073689
  • 温故而知新:周末复习一下 Android & Java 面试题

    当应用启动时,后台没有该应用的进程,这时系统会重新创建一个新的进程分配给该应用,这个启动方式就叫做冷启动((后台不存在该应用进程) 冷启动因为系统会重新创建一个...

    Android技术干货分享
  • Kafka的实现细节

    在Kafka中的每一条消息都有一个topic。一般来说在我们应用中产生不同类型的数据,都可以设置不同的主题。一个主题一般会有多个消息的订阅者,当生产者发布消息到...

    HUC思梦
  • 4 关于游戏服务端架构的整理

    一个大型的网落游戏服务器应该包含几个模块:网络通讯,业务逻辑,数据存储,守护监控(不是必须)。其中业务逻辑可能根据具体需要,又划分为好几个子模块。

    范蠡
  • Java流

    Java IO 流共涉及 40 多个类,这些类看上去很杂乱,但实际上很有规则,而且彼此之间存在非常紧密的联系, Java I0 流的 40 多个类都是从如下 4...

    黑洞代码
  • 为什么要用 Node.js

    传统意义上的 JavaScript 运行在浏览器上,这是因为浏览器内核实际上分为两个部分:渲染引擎和 JavaScript 引擎。前者负责渲染 HTML + C...

    哲洛不闹
  • 金九银十面试准备季:异常+IO与NIO流

    4、try catch fifinally,try里有return,finally还执行么?

    慕容千语
  • 『操作系统』 进程的描述与控制 Part3 管程

    管程:管程是关于共享资源的数据结构及一组针对该资源的操作过程所构成的软件模块。 管程:管理过程

    风骨散人Chiam

扫码关注云+社区

领取腾讯云代金券