当前位置: 首页 > news >正文

java nio(一)buffer

概述

常见的网络io分为两种情况,BIO(block-io)和NIO(non-block-io),分别位于java.io和java.nio。

BIO,是阻塞的io,采用一个线程处理一个连接的方式,就算这个连接什么消息都没有传递,该线程也无法去处理另外的连接。

NIO,相对于BIO,采用一个线程处理所有的连接。也是本文重点描述对象。

NIO的几大名词,

buffer

channel

selector

buffer顾名思义是缓冲区的意思,主要特征有四个,capacity、limit、position、mark,跟数组类似。capacity非负数且不可变,limit是第一个不可被操作的元素的索引,position是下一个元素的索引,mark作为position的替身,用于作标记。以下为原文解释:

A buffer's capacity is the number of elements it contains. The capacity of a buffer is never negative and never changes.

A buffer's limit is the index of the first element that should not be read or written. A buffer's limit is never negative and is never greater than its capacity.

A buffer's position is the index of the next element to be read or written. A buffer's position is never negative and is never greater than its limit. 

创建

以Buffer的子类ByteBuffer为例,从内存的分配方式来看,有两种创建方式,一种是基于JVM的堆分配(non-direct),一种是基于操作系统的内存分配(direct),采用JNI接口,一般而言,direct无论在创建和释放的资源开源都大于non-direct。direct建议使用在占据内存很大的生命周期很长的应用场景,而目的就在于提高程序的性能,降低gc带来的开销。

从初始化的方式来看,也有两种,一种是只初始化分配内存,另一种是根据已有的bytep[]初始化,需要注意的是,这两种初始化后的Buffer的position不同,在get()的时候注意。

重置

clear() ,rewind() ,flip(),这三个接口都可以起到重置作用。原理都是基于capacity、limit、position、mark这四个变量的设置。以下是源代码。

public final Buffer clear() {
        position = 0;
        limit = capacity;
        mark = -1;
        return this;
    }
public final Buffer rewind() {
        position = 0;
        mark = -1;
        return this;
    }
public final Buffer flip() {
        limit = position;
        position = 0;
        mark = -1;
        return this;
    }

案例

ByteBuffer buf = ByteBuffer.allocate(4);
buf.put("test".getBytes());
buf.flip();
buf.mark();
System.out.println((char)buf.get());
System.out.println((char)buf.get());
System.out.println((char)buf.get());
System.out.println((char)buf.get());
buf.reset();
System.out.println((char)buf.get());
t
e
s
t
t

其它

buffer分为只读和读写模式,不是线程安全

 

相关资料

//oracle官方解释-Buffer

http://docs.oracle.com/javase/6/docs/api/java/nio/Buffer.html

//oracle官方解释-ByteBuffer

http://docs.oracle.com/javase/6/docs/api/java/nio/ByteBuffer.html#direct

//写的很详细,图文并茂的一篇博客

http://blog.csdn.net/abc_key/article/details/29909375

 

PS

下方是我个人订阅号,会一直更新各类技术文章,欢迎关注  :)

转载于:https://www.cnblogs.com/ulysses-you/p/6539614.html

相关文章:

  • Sharepoint列表事件处理程序有小问题。
  • git server搭建
  • python、GO中数组的定义。
  • 管理者应有意识地提高以下八项能力
  • *2 echo、printf、mkdir命令的应用
  • 图书 网管天下系列图书 之 网络管理工具实用详解 目录
  • 原生JS与jQuery对AJAX的实现
  • java多线程(一)-概述
  • 网络安全的起跑点Trusted Computing
  • 利用反射——动态调用类中的方法
  • grep过滤用法介绍(二)
  • SourceForge.net 出问题了?
  • 二、中断线程
  • 看看近期读者的书评
  • 程序员需要的都在这里了
  • 【407天】跃迁之路——程序员高效学习方法论探索系列(实验阶段164-2018.03.19)...
  • 【跃迁之路】【463天】刻意练习系列222(2018.05.14)
  • Druid 在有赞的实践
  • isset在php5.6-和php7.0+的一些差异
  • Laravel Mix运行时关于es2015报错解决方案
  • leetcode讲解--894. All Possible Full Binary Trees
  • Meteor的表单提交:Form
  • Mysql数据库的条件查询语句
  • Perseus-BERT——业内性能极致优化的BERT训练方案
  • rabbitmq延迟消息示例
  • spring-boot List转Page
  • Vue2.0 实现互斥
  • WinRAR存在严重的安全漏洞影响5亿用户
  • 分布式熔断降级平台aegis
  • 力扣(LeetCode)357
  • 浅谈web中前端模板引擎的使用
  • 如何正确配置 Ubuntu 14.04 服务器?
  • 首页查询功能的一次实现过程
  • 系统认识JavaScript正则表达式
  • HanLP分词命名实体提取详解
  • $emit传递多个参数_PPC和MIPS指令集下二进制代码中函数参数个数的识别方法
  • $L^p$ 调和函数恒为零
  • $refs 、$nextTic、动态组件、name的使用
  • (1)(1.13) SiK无线电高级配置(六)
  • (C++)栈的链式存储结构(出栈、入栈、判空、遍历、销毁)(数据结构与算法)
  • (HAL库版)freeRTOS移植STMF103
  • (非本人原创)史记·柴静列传(r4笔记第65天)
  • (附源码)ssm高校升本考试管理系统 毕业设计 201631
  • (力扣题库)跳跃游戏II(c++)
  • (免费领源码)Java#ssm#MySQL 创意商城03663-计算机毕业设计项目选题推荐
  • (三)elasticsearch 源码之启动流程分析
  • (图)IntelliTrace Tools 跟踪云端程序
  • (轉)JSON.stringify 语法实例讲解
  • (轉貼) 寄發紅帖基本原則(教育部禮儀司頒布) (雜項)
  • .locked1、locked勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .NET Framework 3.5中序列化成JSON数据及JSON数据的反序列化,以及jQuery的调用JSON
  • .NET/C# 推荐一个我设计的缓存类型(适合缓存反射等耗性能的操作,附用法)
  • .net经典笔试题
  • .net下简单快捷的数值高低位切换
  • .NET中两种OCR方式对比