专栏首页阿林前端开发攻城狮实现getChannel()+非直接缓冲区
原创

实现getChannel()+非直接缓冲区

直接缓冲区

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

public static ByteBuffer allocateDirect(int capacity) {
    return new DirectByteBuffer(capacity);
}

DirectByteBuffer(int cap) {                   // package-private
	...
    // 申请物理内存
	boolean pa = VM.isDirectMemoryPageAligned();
	...
}

直接缓冲区通过在操作系统和JVM之间创建物理内存映射文件加快缓冲区数据读/写入物理磁盘的速度。放到物理内存映射文件中的数据就不归应用程序控制了,操作系统会自动将物理内存映射文件中的数据写入到物理内存中。

通道(Channel)

Channel由java.nio.channels 包定义的。Channel 表示IO 源与目标打开的连接。Channel 类似于传统的“流”。只不过Channel 本身不能直接访问数据,Channel 只能与Buffer 进行交互

应用程序进行读写操作调用函数时,底层调用的操作系统提供给用户的读写API,调用这些API时会生成对应的指令,CPU则会执行这些指令。在计算机刚出现的那段时间,所有读写请求的指令都有CPU去执行,过多的读写请求会导致CPU无法去执行其他命令,从而CPU的利用率降低。

后来,DMA(Direct Memory Access,直接存储器访问)出现了。当IO请求传到计算机底层时,DMA会向CPU请求,让DMA去处理这些IO操作,从而可以让CPU去执行其他指令。DMA处理IO操作时,会请求获取总线的使用权。当IO请求过多时,会导致大量总线用于处理IO请求,从而降低效率

于是便有了Channel(通道),Channel相当于一个专门用于IO操作的独立处理器,它具有独立处理IO请求的能力,当有IO请求时,它会自行处理这些IO请求 。

Java Channel

  • 本地文件IO
    • FileChannel
  • 网络IO
    • SocketChanel、ServerSocketChannel:用于TCP传输
    • DatagramChannel:用于UDP传输

获得通道的方法

对象调用getChannel() 方法

获取通道的一种方式是对支持通道的对象调用getChannel() 方法。支持通道的类如下:

  • FileInputStream
  • FileOutputStream
  • RandomAccessFile
  • DatagramSocket
  • Socket
  • ServerSocket

例子:

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.DatagramSocket;
import java.net.ServerSocket;
import java.net.Socket;
import java.nio.channels.DatagramChannel;
import java.nio.channels.FileChannel;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.nio.file.Paths;

public class demo2 {
    public static void main(String[] args) throws IOException {
        // 本地通道
        FileInputStream fileInputStream = new FileInputStream("zwt");
        FileChannel channel1 = fileInputStream.getChannel();

        FileOutputStream fileOutputStream = new FileOutputStream("zwt");
        FileChannel channel2 = fileOutputStream.getChannel();

        // 网络通道
        Socket socket = new Socket();
        SocketChannel channel3 = socket.getChannel();

        ServerSocket serverSocket = new ServerSocket();
        ServerSocketChannel channel4 = serverSocket.getChannel();

        DatagramSocket datagramSocket = new DatagramSocket();
        DatagramChannel channel5 = datagramSocket.getChannel();

        // 最后要关闭通道


        FileChannel open = FileChannel.open(Paths.get("zwt"));

        SocketChannel open1 = SocketChannel.open();

    }
}

getChannel()+非直接缓冲区

  • getChannel()获得通道
  • allocate()获得非直接缓冲区

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

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

我来说两句

0 条评论
登录 后参与评论

相关文章

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

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

    用户4919348
  • 非直接缓冲区和直接缓冲区 有什么区别

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

    用户7108768
  • java nio剖析

    java nio 的全称是 java new I/O ,即一个全新的 I/O 控制系统,它的 API 的包名为 java.nio ,是在 ...

    全栈程序员站长
  • Java - 从文件压缩聊一聊I/O一二事

    可以看到read0() 一个调用本地方法与原生操作系统进行交互,从磁盘中读取数据。每读取一个字节的数据就调用一次本地方法与操作系统交互,一个63M的文档,转...

    小小工匠
  • 不学无数 — Java 中 IO 和 NIO

    I/O 问题是任何编程语言都无法回避的问题,可以说 I/O 问题是整个人机交互的核心问题,因为 I/O 是机器获取和交换信息的主要渠道。在当今这个数据大爆炸时代...

    Java天坑
  • 百万并发「零拷贝」技术系列之Java实现

    在上一篇推文中讲解了零拷贝思想在Linux系统中的实现,主要有mmap、sendfile、splice、tee等,但在Java中目前主要实现了mmap和send...

    码农神说
  • 不同缓冲区实现传输效果不一样

    用户7108768
  • 「高并发通信框架Netty4 源码解读(五)」NIO通道Channel详解

    通道可以形象地比喻为银行出纳窗口使用的气动导管。您的薪水支票就是您要传送的信息,载体(Carrier)就好比一个缓冲区。您先填充缓冲区(将您的支票放到载体上),...

    源码之路
  • NIO前言:一、NIO与IO的区别二、通道和缓冲区三、NIO的网络通信总结:

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

    贪挽懒月
  • NIO效率高的原理之零拷贝与直接内存映射

    在笔者上一篇博客,详解了NIO,并总结NIO相比BIO的效率要高的三个原因,点击查看。

    全菜工程师小辉
  • 重新认识 Java 中的内存映射(mmap)

    mmap 是一种内存映射文件的方法,即将一个文件映射到进程的地址空间,实现文件磁盘地址和一段进程虚拟地址的映射。实现这样的映射关系后,进程就可以采用指针的方式读...

    kirito-moe
  • 压缩20M文件从30秒到1秒的优化过程

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

    猿天地
  • 超赞,压缩20M文件从30秒到1秒的优化过程

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

    业余草
  • 压缩20M文件从30秒到1秒的优化,太骚了

    来源:https://www.jianshu.com/p/25b328753017

    开发者技术前线
  • Java 压缩20M文件从30秒到1秒的优化过程

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

    搜云库技术团队
  • 20M 文件用 Java 压缩从30秒到1秒的优化过程

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

    Bug开发工程师
  • 20M 文件用 Java 压缩从30秒到1秒的优化过程

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

    用户5224393
  • 不是我吹,20M的压缩文件我只用了1秒!

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

    IT大咖说
  • Java 压缩20M文件从30秒到1秒的优化过程,还不相信?

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

    肉眼品世界

扫码关注云+社区

领取腾讯云代金券