专栏首页阿林前端开发攻城狮非直接缓冲区和直接缓冲区 有什么区别
原创

非直接缓冲区和直接缓冲区 有什么区别

放入前参数
position 0
limit 1024
capacity 1024

------put()------
放入3个数据
放入后参数
position 3
limit 1024
capacity 1024

------flip()-get()------
读取一个数据
读取后参数
position 1
limit 3
capacity 1024

------rewind()------
恢复后参数
position 0
limit 3
capacity 1024

------clear()------
清空后参数
position 0
limit 1024
capacity 1024

清空后获得数据
1

Process finished with exit code 0

非直接缓冲区和直接缓冲区

非直接缓冲区

通过allocate()方法获取的缓冲区都是非直接缓冲区。这些缓冲区是建立在JVM堆内存之中的。

public static ByteBuffer allocate(int capacity) {
    if (capacity < 0)
    throw new IllegalArgumentException();

    // 在堆内存中开辟空间
    return new HeapByteBuffer(capacity, capacity);
}

HeapByteBuffer(int cap, int lim) {        // package-private
    // new byte[cap] 创建数组,在堆内存中开辟空间
    super(-1, 0, lim, cap, new byte[cap], 0);
    /*
    hb = new byte[cap];
    offset = 0;
    */
}

通过非直接缓冲区,想要将数据写入到物理磁盘中,或者是从物理磁盘读取数据。都需要经过JVM和操作系统,数据在两个地址空间中传输时,会copy一份保存在对方的空间中。所以费直接缓冲区的读取效率较低.。

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

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

关注作者,阅读全部精彩内容

我来说两句

0 条评论
登录 后参与评论

相关文章

  • NIO之缓冲区【直接和非直接缓冲区】

      字节缓冲区跟其他缓冲区类型最明显的不同在于,它们可以成为通道所执行的 I/O 的源头和/或目标。其实发现通道只接收ByteBuffer作为参数这个将Chan...

    用户4919348
  • 实现getChannel()+非直接缓冲区

    只有ByteBuffer可以获得直接缓冲区,通过allocateDirect()获取的缓冲区为直接缓冲区,这些缓冲区是建立在物理内存之中的。

    用户7108768
  • python readinto直接读取到缓冲区

    def read_into_buffer(filename): buf = bytearray(os.path.getsize(filename)) wit...

    用户5760343
  • open()+直接缓冲区使用原理

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

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

    用户7108768
  • 接口和抽象有什么区别?

    接口是对行为的抽象,它是抽象方法的集合,利用接口可以达到API 定义和实现分离的目的。

    王小明_HIT
  • 【修正版】动图图解!代码执行send成功后,数据就发出去了吗?

    编程的时候,如果要跟某个IP建立连接,我们需要调用操作系统提供的 socket API。

    9号同学
  • 文件IO

    磁盘IO是非常缓慢的,Linux内核为了减少磁盘的IO次数,在系统调用后,会把用户数据拷贝到内核缓存起来,这个内核缓存空间称之为页缓存。

    shysh95
  • NIO 和 IO 到底有什么区别?别说你不会!

    通道是对原 I/O 包中的流的模拟。到任何目的地(或来自任何地方)的所有数据都必须通过一个 Channel 对象(通道)。

    Java技术栈
  • 谈谈接口和抽象类有什么区别?

    接口是对行为的抽象,它是抽象方法的集合,利用接口可以达到 API 定义和实现分离的目的。

    葆宁
  • 将20M文件从30秒压缩到1秒,我是如何做到的?

    有一个需求需要将前端传过来的10张照片,然后后端进行处理以后压缩成一个压缩包通过网络流传输出去。之前没有接触过用Java压缩文件的,所以就直接上网找了一个例子改...

    JAVA葵花宝典
  • 妹妹10分钟就玩懂了零拷贝和NIO,也太强了

    '零拷贝'这个词大家应该不陌生了,也算是大厂面试中的一个高频考点,玩过 NETTY 的朋友应该对此相当熟悉了,NETTY 的「高并发」很大程度上都是因为 NIO...

    moon聊技术
  • Netty系列| Netty创始人告诉你为什么选择NIO

    NIO模型 同步非阻塞 NIO有同步阻塞和同步非阻塞两种模式,一般讲的是同步非阻塞,服务器实现模式为一个请求一个线程,但客户端发送的连接请求都会注册到多路复用器...

    狼王编程
  • NIO前言:一、NIO与IO的区别二、通道和缓冲区三、NIO的网络通信总结:

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

    贪挽懒月
  • 将20M文件从30秒压缩到1秒,我是如何做到的?

    原文链接:https://www.jianshu.com/p/25b328753017

    用户1516716
  • linux网络编程系列(七)--如何将socket设置成非阻塞的,非阻塞socket与阻塞的socket在收发数据上的区别

    socket函数创建socket默认是阻塞的,也可以增加选项将socket设置为非阻塞的:

    cpp加油站
  • Java NIO

    NIO即New IO,这个库是在JDK1.4中才引入的。NIO和IO有相同的作用和目的,但实现方式不同,NIO主要用到的是块,所以NIO的效率要比IO...

    随心助手
  • 【Java SE】Java NIO系列教程(十二)Java NIO与IO

    当学习了Java NIO和IO的API后,一个问题马上涌入脑海: 我应该何时使用IO,何时使用NIO呢?在本文中,我会尽量清晰地解析Java NIO和IO的差异...

    用户1257215
  • java NIO浅析

    NIO主要有三大核心部分:Channel(通道),Buffer(缓冲区),Selector(选择器)。传统IO基于字节流和字符流进行操作,而NIO基于Chann...

    Java阿呆

扫码关注云+社区

领取腾讯云代金券