zoukankan      html  css  js  c++  java
  • 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

     结束。

    天道酬勤

  • 相关阅读:
    javascript日期相减,求时间差
    Python向PHP发起GET与POST请求
    Discuz安装
    Java程序猿的JavaScript学习笔记(10—— jQuery-在“类”层面扩展)
    聚合类新闻client的改进
    Spring MVC 框架搭建及具体解释
    兼容placeholder
    创建cocos2d-x+lua项目
    纯CSS弹出层,城市切换效果
    tcp_recvmsg 函数具体解释
  • 原文地址:https://www.cnblogs.com/lwhblog/p/10837580.html
Copyright © 2011-2022 走看看