范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

javaNIO学习笔记(三)

  javaNIO 学习笔记(三)Java NIO Buffer
  缓冲区,可以通过 channel  将数据写入缓冲区,也可以从通道中读取数据到缓冲区
  缓冲区本质上是一个内存块,您可以将数据写入其中,然后再读取数据。这个内存块包装在一个NIO缓冲区对象中,该对象提供了一组方法,使使用内存块变得更容易。
  使用缓冲区读取和写数据一般分为下面四个步骤: 将数据写入缓冲区 调用  flip()  方法从缓冲区读取数据 调用 clear()  或者compact()  当数据写入数据到缓冲区时,缓冲区会记录对应数据量的信息(这个需要看缓冲区大小和数据量大小)。
  数据读取后需要使用flip()方法切换缓冲区的读写模式(换个角度可以理解为存取模式)。在读取模式下,您可以通过相应的方法将数据从缓冲区中读取出来。读取完数据后需要将缓冲区清空。这样缓冲区就会再次进入写入模式。(这里调用的方式就是  clear  和compact  , clear  是清空, compact  则是清理掉已读取的数据,未读取的数据则放入缓冲区头)
  使用的例子上一篇学习笔记已经写了。
  我们来看下 buffer  的工作模式。buffer  有三个主要属性capacity(buffer容量):这是 buffer  的大小即容量。在调用buffer.allocate()指定大小即是这个属性position(读取模式的位置,在读写模式中表现不一样) limit(读写模式中表现也不一样)
  在写入模式下, position  初始值为0.当一个字节,没写入一个字节数字都会将position  +1.limit  初始值为capacity  。在读取模式下,会将limit  位置设置在```position位置放置为0,此时读取数据是从  position到limit  。看下clear  和flip  的源码大概就可以理解了public final Buffer clear() {             position = 0; //设置当前下标为0             limit = capacity; //设置写越界位置与和Buffer容量相同              mark = -1; //取消标记              return this;  }    public final Buffer flip() {          limit = position;          position = 0;          mark = -1;          return this;  }
  buffer的主要类型如下: ByteBuffer CharBuffer DoubleBuffer FloatBuffer IntBuffer LongBuffer ShortBuffer MappedByteBuffer
  可以看到,这些缓冲区类型表示不同的数据类型。换句话说,它们允许您将缓冲区中的字节改为char、short、int、long、float或double。
  学习下 buffer  的几个常见方法:// 可以通过调用Buffer.mark()方法标记缓冲区中的给定位置。然后,您可以通过调用Buffer.reset()方法将位置重置回标记的位置。 public final Buffer mark() {     mark = position;     return this; }  public final Buffer reset() {     int m = mark;     if (m < 0)         throw new InvalidMarkException();     position = m;     return this; } equals()和compareTo ()可以使用equals()和compareTo()比较两个缓冲区。 equals ()
  两个缓冲区是相等的,如果:
  它们是相同类型的(字节、char、int等)。
  它们在缓冲区中有相同数量的剩余字节、字符等。
  所有剩余的字节、字符等都是相等的。
  可以看到,equals只比较缓冲区的一部分,而不是其中的每个元素。实际上,它只是比较缓冲区中剩余的元素。
  compareTo ()
  方法比较两个缓冲区的剩余元素(字节,字符等),用于排序例程。一个缓冲区被认为比另一个缓冲区"小",如果:
  第一个元素等于另一个缓冲区中对应的元素,小于另一个缓冲区中的元素。
  所有的元素都是相等的,但是第一个缓冲区比第二个缓冲区早耗尽元素(它的元素更少)。  Java NIO Scatter / Gather
  Java NIO 提供了内置功能 Scatter/Gather。可以将数据从一个通道写入多个缓冲区。通道也可以从多个缓冲区收集数据。在需要分别处理传输数据的各个部分的情况下,Scatter/Gather非常有用。例如,如果消息由消息头和消息体组成,则可以将消息头和消息体保存在单独的缓冲区中。这样做可以更容易分别使用标题和主体。 package jniolearn;  import java.io.FileNotFoundException; import java.io.IOException; import java.io.RandomAccessFile; import java.nio.ByteBuffer; import java.nio.channels.FileChannel;  /**  * @Author: jimmy  * @Date: 2020/6/14 14:50  * @Description:  */ public class NioScatter {      public static void main(String[] args) throws IOException {          // 创建一个rw模式的随机文件         RandomAccessFile randomAccessFile =new RandomAccessFile("D:nioFile.txt", "rw");         // 获取fileChinnel         FileChannel fileChannel = randomAccessFile.getChannel();          // 1、分配缓冲区         ByteBuffer header = ByteBuffer.allocate(10);         ByteBuffer body  = ByteBuffer.allocate(128);          // 缓冲数组         ByteBuffer[] bufferArray = {header, body};         // 2、将数组读入到数组         fileChannel.read(bufferArray);          // Buffer切换模式之前,即处于写模式下,打印Buffer,查看position, limit, capacity属性         System.out.println(header.toString());         System.out.println(body.toString());          // 3、切换模式         header.flip();         body.flip();          //  4、获取数组         System.out.println("header:");         while (header.hasRemaining()) {             System.out.print((char) header.get());         }          System.out.println(" body:");         while (body.hasRemaining()) {             System.out.print((char) body.get());         }          header.clear();         body.clear();          fileChannel.close();      }  } // 返回结果 java.nio.HeapByteBuffer[pos=10 lim=10 cap=10] java.nio.HeapByteBuffer[pos=24 lim=128 cap=128] header: Hi, I am j body: immy; be happy everyday
  read  按照buffer  数组中的顺序将从channel中读取的数据写入到buffer  ,当一个buffer  被写满后,channel  紧接着向另一个buffer  中写。Scattering Reads  在移动下一个buffer  前,必须填满当前的buffer  ,这也意味着它不适用于动态消息。这样若要是想在消息中使用那么就必须规定好每一段的字节长度,并且按照这个规定严格执行,不能存在偏差。不然就会出现部分信息少读或者多读的情况。package jniolearn;  import java.io.IOException; import java.io.RandomAccessFile; import java.nio.ByteBuffer; import java.nio.channels.FileChannel;  /**  * @Author: jimmy  * @Date: 2020/6/14 15:07  * @Description:  */ public class NioGather {      public static void main(String[] args) throws IOException {          RandomAccessFile randomAccessFile =new RandomAccessFile("D:gaterFile.txt", "rw");         // 获取fileChinnel         FileChannel fileChannel = randomAccessFile.getChannel();          // 1、分配缓冲区         ByteBuffer header = ByteBuffer.allocate(32);         ByteBuffer body  = ByteBuffer.allocate(128);          // 2、放入数据         header.put("hi, weather ?".getBytes());         header.put("body:raining".getBytes());          // 3、存入buffer数组         ByteBuffer[] bufferArray = {header, body};          System.out.println(header.toString());         System.out.println(body.toString());          header.flip();         body.flip();          fileChannel.write(bufferArray);          fileChannel.close();     } }
  查看文件信息:hi, weather ?body:raining
  write  方法同样是按照buffer  数组的顺序,将数据写入到channel  ,注意只有position和limit之间的数据才会被写入。因此,如果一个buffer的容量为128byte,但是仅仅包含14byte的数据,那么这14byte的数据将被写入到channel  中。和Scattering Reads  相反,Gathering Writes  能较好地处理动态消息。Java NIO Channel to Channel Transfers
  Java NIO还提供了一种通道间传输数据的方法, FileChannel  类有一个transferTo()  和一个transferFrom()  方法----  transferFrom   ---- RandomAccessFile fromFile = new RandomAccessFile("fromFile.txt", "rw"); FileChannel      fromChannel = fromFile.getChannel();  RandomAccessFile toFile = new RandomAccessFile("toFile.txt", "rw"); FileChannel      toChannel = toFile.getChannel();  long position = 0; long count    = fromChannel.size();  toChannel.transferFrom(fromChannel, position, count);  ----  transferTo   ---- RandomAccessFile fromFile = new RandomAccessFile("fromFile.txt", "rw"); FileChannel fromChannel = fromFile.getChannel();  RandomAccessFile toFile = new RandomAccessFile("toFile.txt", "rw"); FileChannel toChannel = toFile.getChannel();  long position = 0; long count = fromChannel.size();  fromChannel.transferTo(position, count, toChannel);
  小结下前面几篇学习的内容: 如何使用 buffer  需要先分配一个缓冲区(我这里理解为初始化一个指定大小的缓冲区)使用ByteBuffer.allocate()  读则是从channel read  ,写则是先要将数据放入缓冲区,然后使用channel write  把数据写入通道注意buffer  的模式切换使用flip  方法。另外还有 clear   compact   rewind  等方法buffer  的几个主要属性capacity 缓冲区大小(比如缓冲区长度48,则capacity也是48.但是这里要注意capacity下表是从0开始,所以这个可以理解为内存溢出位)position 在读模式的时候初始值为0,读数据的时候会逐步增加最大能读到capacity -1。切换到写模式的时候position为0limit 读模式的时候默认为capacity。写模式的时候,会将limit设置为读模式的position的位置。scatter  和gather  可以理解为分散收集,一个是读,一个是写。这个是内置的。就是一个channel  和多个buffer  的读写。channel  如何获取可以直接使用open方法,fileChannel则还可以通过类RandomAccessFile  的实例getChannel

华为轮值董事长郭平我挺欣赏德川家康,他足够坚韧(观察者网讯)日前,华为举行轮值董事长郭平与新员工座谈会。有新员工问我是中国地区企业BG的客户经理,我想问一下,从领导层面上来说,您的个人偶像是哪一位?您最敬畏他哪一点,从什么事情华为取消5G快捷开关,运营商为撬动4G钉子户不择手段根据今年上半年的三大运营商最新报告显示,目前我们国内已经有了高达5亿多的5G用户,可以看出,在经历了两年多的时间后,目前国内许多4G网络用户都已经体验过5G了。毕竟5G网络是国家多华为Mate50规格曝光,6000mAh屏下摄像头,值得花粉苦苦等待对于华为下一代旗舰机的关注,不论是不是花粉都非常关注,毕竟华为可是中国手机品牌的骄傲啊,同时今年华为P50系列也是目前国产化最高的手机,可见华为对国内供应商的支持,但是很多花粉还是3款目前最强悍骁龙888的安卓手机对比!荣耀很强势买手机的时候,很多人最关心的话题永远是手机的性能,那么说到手机的性能,手机使用的芯片至关重要,而目前在安卓手机阵营中,最高级的芯片是骁龙888系列,它也是目前几乎所有使用安卓系统品IPFS周报149TikTok选择Audius作为解决方案IPFS和Audius合作7月,2021年DoraHacksFilecoinGrants黑客马拉松的投票期结束。在两个多月的时间里,第一轮拨款向基于IPFS和Filecoin的获奖项目分发了24。9万美元,比亚迪海洋馆正式开张比亚迪的汽车家族越来越热闹。8月13日,预热了小半年的比亚迪海豚正式启动预售。这款定位小型车的纯电动车,共四款车型,活力版自由版时尚版及骑士版共计4款配置,续航里程分别为301kmOPPO上架15W无线充电器售价99元OPPO近日悄悄推出了一款新的无线充电器,名为OPPO无线充电器15W。新推出的OPPO无线充电器是圆形的,有单一的白色选项。顾名思义,它的最大输出功率为15W,因此,它是该公司迄小度主动降噪智能耳机Pro发布,40dB降噪8月18日,小度主动降噪智能耳机Pro正式发布,尝鲜价399元。小度主动降噪智能耳机Pro采用双重主动降噪技术,最大降噪深度可达40dB,能够降低嘈杂环境的噪音影响。这款耳机还支持富达投资90大客户对比特币和其他加密货币感兴趣富达投资近日表示,其90的大客户都对比特币和其他加密货币感兴趣。该公司目前正计划向散户投资者开放数字资产领域。(附注富达投资集团成立于1946年,总部设在美国波士顿,为美国专业投资顺丰真正的对手中国第二大快递确认,年营收已超过三通一达2021年8月份,邮政局发布了关于2021年第二季度快递服务满意度调查和时限准时率测试结果的通告,满意度分数7476分之间的企业是百世快递和极兔速递分数在7680分之间的企业是中通宁晶网络用户使用技能和心理效能影响算法接受度中新经纬客户端8月18日电(薛宇飞)近日,由清华大学数据治理研究中心主办的人工智能伦理与治理研讨会在线上举行。对外经济贸易大学政府管理学院讲师宁晶在研讨会上称,通过对国外社交媒体用
六万人在线帮主播砍1台手机失败!客服挂断电话,回应来了你有没有收过昔日旧友,甚至前任的消息不是借钱,不是结婚发请帖,不是发广告,只是让你帮忙砍一刀?这砍的不是一分钱,而是咱之间的情分啊,所以pdd砍一刀又被称为友谊试金石友情终结者亲情再现黄金坑,策马新征程新能源汽车股,惊现黄金坑!一,基本面所属行业汽车服务概念特斯拉华为新能源汽车等。流通市值80。42亿,市盈率30。63二,技术形态从高位11。45元跌至6。28元,调整周期3个多月零跑上市,只为圈钱?撰文韩玲编辑冒诗阳(图视觉中国)零跑疯狂放卫星卖的越多亏的越惨继小鹏理想蔚来相继赴港上市后,二线造车新势力也开始坐不住了,零跑汽车正试图成为国内造车新势力中第四家上市公司。港交所网滴滴又有新动作,是绝地反击还是一蹶不振?说到滴滴出行这家网约车平台,相信大家都不会陌生。自从2016年合并了Uber中国的业务后,滴滴就确立了自身在中国网约车市场的主导地位。尽管美团等互联网巨头也陆续瞄准这一市场,都没能海信视像携手清华大学共建全息交互技术联合研究中心近日清华大学(自动化系)海信视像科技股份有限公司全息交互技术联合研究中心成立。海信视像通过旗下互联网平台公司聚好看与清华大学自动化系以多学科交叉和产学研用深度融合的方式,开展智能全木林森股份正式签约广联达科技3月18日,木林森股份有限公司(股票代码002745)与广联达科技股份有限公司(股票代码002410)在木林森中山小榄基地举行战略签约仪式。按照战略合作协议,双方将共建木林森照明工共享单车锁车难!无奈被多扣钱,应何处安放?共享单车从最初的野蛮生长至今,遭遇多重问题,屡屡成为话题中心。即便是目前,仍有诸多需要探索和改进的空间,为了解决当初的乱停乱放占道等乱象,目前很多城市,都划定了大量的电子围栏区域,Linux标准输入输出重定向管道文件权限后台启动进程命令1三种标准输入输出标准输入(STDIN),文件描述符号为0,默认从键盘获取输入标准输出(STDOUT),文件描述符号为1,默认输出到显示终端标准错误输出(STDERR),文件描述符荣耀Magic3Pro和Magic4Pro有什么区别?如何选择更好?荣耀Magic3Pro采用骁龙888Plus处理器LPDDR5内存UFS3。1闪存的性能组合,6。76英寸OLED双曲面屏,27721344分辨率,120Hz刷新率,周冬雨排列,支315汽车质量回顾新能源汽车问题频发,召回数量增长75。9实习记者李紫晴刘爽汽车行业发展迅猛,竞争日益激烈,在315国际消费者权益日即将到来之际,每一家车企都如临大考。汽车质量问题以及相关维权事件又将成为消费者们关注的焦点。新能源市场的快仅售2099元?12GB512GB5600mAh,优质新机不值钱了要是提起现在什么手机最吃香,也许许多人会脱口而出苹果,三星,华为,小米等品牌,诚然,在现在手机市场十分兴盛的今天,众多品牌可以说是群雄争霸,十分激烈。时候普及市场的各种品牌与品类也