• Nio Buffer


    这篇博客是为了记录下自己学习nio Buffer这一块一些粗浅的了解

    java io

    我们首先直到,java io是面向流的编程,并且,一个流要么是输出流,要么是输出流,不肯能即是输入流又是输出流。

    java nio

    首先了解一下java nio中三个核心概念:Selector,Channel,Buffer   

    nio还是面向块(block)或是缓冲区(buffer)编程

    bufferbytes.flip()是实现状态的翻转,进行读写切换一定要调用flip

    Channel是双向的

    既然谈到了buffer,那么就说一下NIO Buffer中的三个重要的状态属性,这也是这篇的主题

    首先介绍一下概念

    position:下一个将要读或者写的元素的索引

    limit开始指向capacity的位置,当读完后执行flip,Potition指向开头,limit指向position原先的位置

    我们用画图来更直观的了解

    开始状态

    读入两个数据

    再读入两个数据

    flip后,需要些数据,Position是指向开头,limit指向原先position的位置

    写出两个数据

    最多只能写到limit所在的位置

    Buffer本身不是线程安全的

    根据代码的现象来看,我做了一些总结

    如果这个时候把数据拿出去的话,那么新写进来的两个数据不会被读取到

    而是输出position到limit之间的数据

    你再执行flip,就变成了这个酱紫

    clear只是对Position和limit的位置做了初始化的调整(就是position = 0,limit = capacity),buffer中的数据并没有清除

     下面是一个比较重要的知识

    正常运行的结果大家都很清楚:47 -1

    那么我们如把clear这段代码注释掉会发生什么呢,答案是死循环,就是循环写

    为什么呢

    read读取的时候它是先看能不能往buffer中填数据了,如果没有空间(意思position和limit指向同一位置),那么这个read方法直接返回0

    只有当buffer中有空间的时候,它才会看inputChannel里面还有没有可以读的数据,如果有,返回读取数据的大小;没有,则返回-1

     结束。

    天道酬勤

  • 相关阅读:
    深入浅出 JVM ClassLoader
    JVM 线上故障排查基本操作
    深入浅出 JVM GC(3)
    MyBatis 源码分析系列文章合集
    MyBatis 源码分析
    MyBatis 源码分析
    MyBatis 源码分析
    MyBatis 源码分析
    MyBatis 源码分析
    MyBatis 源码分析系列文章导读
  • 原文地址:https://www.cnblogs.com/lwhblog/p/10837580.html
Copyright © 2020-2023  润新知