`
jamie.wang
  • 浏览: 340563 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

Java NIO 之 Buffers

阅读更多

你可以把ByteBuffer看着是一段连续内存(实际却不一定),或Byte的数组。Buffer类则提供了很多方法去访问/设置元素。而基于之上的CharBuffer,IntBuffer等则是是数据类型的抽象。

 

1. Buffer 类图

 

2. 主要属性

Capacity,能容纳的最多元素个数,构造时固定的;

Limit,读写元素的边界,可修改;

Position,当前读写位置,可修改;

Mark,标记位,书签位,不能超过limit,未设置前为undefined状态;

 

0 <= mark <= position <= limit <= capacity

 

3. 难理解的API

3.1 flip

将position指向0,limit指向最后一个元素之后的一个位置,为读元素做好准备。

flip前:



 flip后:


 

flip两次后,position和limit都变成了0。

 

3.2 rewind

倒带,设置position为0,相当于position(0);

 

3.3 compact

将已读完的元素去除,把未读的元素向前移位,将position移到所有未读元素之后,准备写入元素。

compact前:


compact后:


3.4 mark

标记一个位置,reset()将读写指针返回到当前的标记位。

清除标记的方法有:rewind(),clear(),flip(),position(index),limit(index)(如果index < mark).

3.5 clear和reset

clear是清除所有元素,reset是将读写指针返回到当前的标记位。

3.6 equals

下列条件成立则相等:

Buffer同类型;

Buffer剩余元素数目、顺序、值相等,即position和limit之间的元素相等,和capacity,其他元素无关;

3.7 compare

比较也是比较剩余元素,但按照字符串比较的方式进行。

3.8 块移动(Bulk Move)

Buffer可以以块的方式读取或者写入,如:CharBuffer.get(char[] dst); CharBuffer.put(char[] dst),但需注意在读取或写入前,先调用Buffer.remaining()获取剩余的元素个数,或剩余的空间,不然由于目标空间不够会抛出:BufferOverflowException。

3.9 创建Buffer

有两种方式创建Buffer,Buffer.allocate(int capacity);和Buffer.wrap(E[] elements);第一个方法会分配空间,第二种不会,它用elements的空间。

buffer.wrap(E[] elements, int offset, int length);仍然是整个数组,但设置position为offset,limit为length,因为wrap不会分配空间。

这两种方式创建的buffer都不是direct的,都是backing by 数组,hasArray()会返回true;支持数组的操作;

3.10 duplicate

该方法会创建一个新的buffer视图,它的position, limit, mark是独立的,它和原buffer都共享一个backing数组,因此它们任何一个对buffer的更改都会影响另外一个。

asReadyOnlyBuffer则创建一个只读的视图。

slice()则创建部分视图。

3.11 allocateDirect

调用操作系统分配缓冲区,该缓冲区不需要转换就直接可以被底层IO处理,高并发的IO应用重用该缓冲区可以显著提供IO效率,因为它避免了缓冲区的拷贝(JVM内的缓冲区需要拷贝到外部才能被底层IO处理)。

但分配此缓冲区的代价比较大,不能在JVM内部完成,且分配的缓冲区在JVM管理之外,即不是由JVM回收,除非重用率高,不然不推荐使用。

该方法分配的缓冲区,数组的方法是不支持的,会抛UnsupportOperationException。

3.12 asXxxBuffer

ByteBuffer可以创建各种Primitive类型的Buffer视图,如asIntBuffer()。

 

 

 

 

  • 大小: 48.9 KB
  • 大小: 27.9 KB
  • 大小: 28.3 KB
  • 大小: 27.8 KB
  • 大小: 28.1 KB
分享到:
评论

相关推荐

    java NIO 视频教程

    Java NIO: Channels and Buffers(通道和缓冲区) 标准的IO基于字节流和字符流进行操作的,而NIO是基于通道(Channel)和缓冲区(Buffer)进行操作,数据总是从通道读取到缓冲区中,或者从缓冲区写入到通道中。 ...

    java nio教程pdf

    Java NIO: Channels and Buffers(通道和缓冲区) 标准的IO基于字节流和字符流进行操作的,而NIO是基于通道(Channel)和缓冲区(Buffer)进行操作,数据总是从通道读取到缓冲区中,或者从缓冲区写入到通道中。 ...

    Java IO, NIO and NIO.2 原版pdf by Friesen

    not introduced with the other NIO types in Java 1.4 because they depend on the variable arguments capability that was introduced in Java 5.) NIO is missing several features, which were subsequently ...

    nio:Clojure对java.nio的支持

    o Clojure对java.nio的支持。 将clojure.java.io的输入流,输出流和复制功能扩展到java.nio类。 定义新的强制功能缓冲区,字节缓冲区,字符缓冲区,双缓冲区,浮点缓冲区,整数缓冲区,长缓冲区,短缓冲区,通道,可...

    Java NIO 电子书

    Java NIO.pdf Dedication ............................................................................................................................. 1 Preface ..........................................

    Mina 文档doc

    • Multipurpose Infrastructure for Network Applications • 一个基于非阻塞I/O的网络框架。...如果你使用MINA,你将不需要直接使用NIO buffers,因为仅使用MINA buffers就可以完成大多数buffer操作

    《Learning.Network.Programming.with.Java》高清完整PDF版

    * Use channels and buffers to enhance communication between applications * Access network services and develop client/server applications * Explore the critical elements of peer-to-peer applications ...

    libmagic-jna-wrapper:用于调用 libmagic 的 JavaJNA 包装器

    执行文件、输入流和 nio.Buffers 的魔术识别 路线图 符合用户要求的 API 整洁,只是 如何安装和使用 要求 待办事项:要求。 下载 目前没有直接下载 安装说明 待办事项:安装。 用 去做: 故障排除 去做: 更多信息 ...

    Android代码-okio

    Okio is a library that complements java.io and java.nio to make it much easier to access, store, and process your data. It started as a component of OkHttp, the capable ...

    《Netty in action》中文版

    1. Netty 与Java NIO APIs 2. 你的第一个netty应用程式 3. Netty 起源 第二部分: netty的核心部分 4. 数据传输Transports 5.缓冲区 Buffers 6. channel处理程式ChannelHandler 7.编解码 Codec 8. ChannelHandlers与...

    netty in action第一章阅览

    1. Netty 与Java NIO APIs 2. 你的第一个netty应用程式 3. Netty 起源 第二部分: netty的核心部分 4. 数据传输Transports 5.缓冲区 Buffers 6. channel处理程式ChannelHandler 7.编解码 Codec 8. ChannelHandlers与...

    Learning Network Programming with Java 2016无水印pdf 0分

    Use channels and buffers to enhance communication between applications Access network services and develop client/server applications Explore the critical elements of peer-to-peer applications and ...

    Netty in Action.2014(MEAP v08)

    1 Netty and Java NIO APIs - FREE 2 Your first Application with Netty - AVAILABLE PART 2: CORE FUNCTIONS / PARTS 3 General design ideas of Netty 4 Transports - AVAILABLE 5 Buffers - AVAILABLE 6 ...

    protobuf-demo

    protobuf-rpc-pro是一个Java类库,提供了基于 Google 的 Protocol Buffers 协议的远程方法调用的框架。基于 Netty 底层的 NIO 技术。支持 TCP 重用/ keep-alive、客户端和服务端双向调用、SSL加密、RPC 调用取消操作...

Global site tag (gtag.js) - Google Analytics