专栏首页阿林前端开发攻城狮不同缓冲区实现传输效果不一样
原创

不同缓冲区实现传输效果不一样

使用直接缓冲区时,无需通过通道来传输数据,直接将数据放在缓冲区内即可

import java.io.IOException;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;
import java.nio.file.Paths;
import java.nio.file.StandardOpenOption;

public class demo5 {
    public static void main(String[] args) throws IOException {
        // 通过open()方法来获得通道
        FileChannel inChannel = FileChannel.open(Paths.get(""), StandardOpenOption.READ);

        // outChannel需要为 READ WRITE CREATE模式
        // READ WRITE是因为后面获取直接缓冲区时模式为READ_WRITE模式
        // CREATE是因为要创建新的文件
        FileChannel outChannel = FileChannel.open(Paths.get(""), StandardOpenOption.READ, StandardOpenOption.WRITE, StandardOpenOption.CREATE);

        // 获得直接缓冲区
        MappedByteBuffer inMapBuf = inChannel.map(FileChannel.MapMode.READ_ONLY, 0, inChannel.size());
        MappedByteBuffer outMapBuf = outChannel.map(FileChannel.MapMode.READ_WRITE, 0, inChannel.size());

        // 字节数组
        byte[] bytes = new byte[inMapBuf.limit()];

        // 因为是直接缓冲区,可以直接将数据放入到内存映射文件,无需通过通道传输
        inMapBuf.get(bytes);
        outMapBuf.put(bytes);

        // 关闭缓冲区,这里没有用try-catch-finally
        inChannel.close();
        outChannel.close();
    }
}

通道间直接传输

public static void channelToChannel() throws IOException {
   long start = System.currentTimeMillis();
   // 通过open()方法来获得通道
   FileChannel inChannel = FileChannel.open(Paths.get(""), StandardOpenOption.READ);

   // outChannel需要为 READ WRITE CREATE模式
   // READ WRITE是因为后面获取直接缓冲区时模式为READ_WRITE模式
   // CREATE是因为要创建新的文件
   FileChannel outChannel = FileChannel.open(Paths.get(""), StandardOpenOption.READ, StandardOpenOption.WRITE, StandardOpenOption.CREATE);

   // 通道间直接传输
   inChannel.transferTo(0, inChannel.size(), outChannel);
   // 对应的还有transferFrom
   // outChannel.transferFrom(inChannel, 0, inChannel.size());

   inChannel.close();
   outChannel.close();
}

直接缓冲区VS非直接缓冲区

// getChannel() + 非直接缓冲区耗时
708
// open() + 直接缓冲区耗时
115
// channel transferTo channel耗时
47
    
直接缓冲区的读写速度虽然很快,但是会占用很多很多内存空间。如果文件过大,会使得计算机运行速度变慢

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

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

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

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 「高并发通信框架Netty4 源码解读(三)」NIO缓冲区Buffer详解

    一个Buffer对象是固定数量的数据的容器。其作用是一个存储器,或者分段运输区,在这里数据可被存储并在之后用于检索。缓冲区如我们在上一篇所讨论的那样被写满和释放...

    源码之路
  • PHP基础之输出缓冲区基本概念、原理分析

    在PHP运行的过程中,可以将会产生输出的函数或操作结果暂时保存在PHP的缓冲区,只有当缓冲区满了、或者PHP运行完毕、或者在必要时候进行输出,才会将数据输出到浏...

    砸漏
  • 【译】Data exchange between tasks(任务之间的数据交换)

    1.用于数据交换的控制流(即:为了启动交换而传递的消息)是接收者启动的,就像原始MapReduce一样

    yiduwangkai
  • 泛广电领域的卫星传输和公网传输

    大家好,我是来自安徽广播电视台的张博力,接下来我将为大家详细介绍泛广电领域的卫星传输和公网传输。

    LiveVideoStack
  • Flink1.4 处理背压

    人们经常会问Flink是如何处理背压(backpressure)效应的。 答案很简单:Flink不使用任何复杂的机制,因为它不需要任何处理机制。它只凭借数据流引...

    smartsi
  • Linux探秘之I/O效率

    一、文章来由   最近看了《UNIX环境高级编程》,对以前比较模糊的一些知识结构又做了进一步的加强,特别是前两章讲到不带缓冲的文件I/O和带缓冲的标准I/O,对...

    猿大白
  • 如何在Mule 4 Beta中实现自动流式传输

    原文地址:https://dzone.com/articles/how-automatic-streaming-in-mule-4-beta-works

    Steve Wang
  • NVIDIA Deepstream 笔记(二):如何设计视频分析的框架?

    你已经非常清楚什么是Deepstream,它为什么存在以及3.0中的一些新功能和增强功能。我们现在要退后一步,深入了解是什么驱动Deepstream.

    GPUS Lady
  • 多线程异步【日志系统】,高效、强悍的实现方式:双缓冲!

    大家好,我是道哥,今天我为大伙儿解说的技术知识点是:【在多线程环境下,如何实现一个高效的日志系统】。

    IOT物联网小镇
  • 有必要了解一下Linux中零拷贝原理 | NIO零拷贝技术实践

    「Zero-copy」 describes computer operations in which the CPU does not perform the ...

    云爬虫技术研究笔记
  • Java基础(五)| IO 流之使用缓冲流的正确姿势

    整理下以前自学的笔记,留个念想,不喜轻喷。希望基础不好的同学看完这篇文章,能掌握缓冲流,而基础好的同学权当复习,希望看完这篇文章能够起一点你的青涩记忆。

    一个优秀的废人
  • 可算是有文章,把Linux零拷贝技术讲透彻了!

    本文探讨Linux中 主要的几种零拷贝技术 以及零拷贝技术 适用的场景 。为了迅速建立起零拷贝的概念,我们拿一个常用的场景进行引入:

    Bug开发工程师
  • Kafka:Zero-Copy 零拷贝

    前一段时间研究了大规模日志流高吞吐并行存储,通过深入研究Kafka的底层存储机制。我们发现Kafka的Zero-Copy零拷贝技术采用的是Java底层FileT...

    孙玄@奈学教育
  • 面试被问到“零拷贝”!你真的理解吗?

    从字面意思理解就是数据不需要来回的拷贝,大大提升了系统的性能;这个词我们也经常在java nio,netty,kafka,RocketMQ等框架中听到,经常作为...

    java架构师
  • 牛逼哄哄的 "零拷贝" 是什么?

    缓冲区是所有I/O的基础,I/O讲的无非就是把数据移进或移出缓冲区;进程执行I/O操作,就是向操作系统发出请求,让它要么把缓冲区的数据排干(写),要么填充缓冲区...

    Java技术栈
  • 20分钟让你了解OpenGL ——OpenGL全流程详细解读

    | 导语 对于开发者来说,学习OpenGL或者其他图形API都不是一件容易的事情。即使是一些对OpenGL有一些经验的开发者,往往也未必对OpenGL有完整、...

    腾讯Bugly
  • 操作系统之设备管理一、I/O管理概述二、I/O硬件组成三、I/O控制方式(重点)四、I/O软件组成五、I/O相关技术六、I/O设备的管理七、I/O性能问题

    JavaEdge
  • Android OpenGL 渲染图像读取哪家强?

    glReadPixels 是 OpenGL ES 的 API ,OpenGL ES 2.0 和 3.0 均支持。使用非常方便,下面一行代码即可搞定,但是效率很低...

    字节流动
  • 原来 8 张图,就可以搞懂「零拷贝」了

    磁盘可以说是计算机系统最慢的硬件之一,读写速度相差内存 10 倍以上,所以针对优化磁盘的技术非常的多,比如零拷贝、直接 I/O、异步 I/O 等等,这些优化的目...

    帅地

扫码关注云+社区

领取腾讯云代金券