`
jamie.wang
  • 浏览: 348792 次
  • 性别: 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.zip

    通道是NIO中的核心概念之一,它提供了从一个数据源(如文件、套接字)到另一个数据源的数据传输路径。Java NIO支持多种类型的通道,包括文件通道(FileChannel)、套接字通道(SocketChannel)和服务器套接字通道...

    java NIO 视频教程

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

    java nio 包读取超大数据文件

    ### Java NIO 处理超大数据文件的知识点详解 #### 一、Java NIO简介 Java NIO(New IO)是Java平台上的新输入/输出流API,它提供了与传统IO(即Java IO)不同的数据处理方式。NIO在Java 1.4版本引入,并在后续版本...

    java nio入门学习,两个pdf

    Java NIO,全称为Non-Blocking Input/Output(非阻塞输入/输出),是Java标准库提供的一种替代传统I/O模型的新技术。在Java 1.4版本中引入,NIO提供了一种全新的I/O编程方式,使得Java开发者能够更高效地处理I/O操作...

    java nio 实现socket

    **NIO非阻塞模式**:相比之下,NIO采用了非阻塞模式,即当没有数据可读时,`read()`方法不会阻塞,而是立即返回。这意味着应用程序可以同时处理多个输入/输出操作,而不需要为每个操作分配一个独立的线程。这样的...

    Java NIO 中英文版

    Java NIO,全称为Non-Blocking Input/Output(非阻塞输入/输出),是Java平台中用于替代标准的I/O模型的一种新机制。在传统的Java I/O中,使用的是Blocking I/O,即阻塞式I/O,这种模型下,线程在等待数据就绪时会被...

    java NIO详细教程

    ### Java NIO 详细教程知识点解析 #### 一、Java NIO 概述 Java NIO(New IO)是Java平台提供的一种新的IO操作模式,它首次出现在Java 1.4版本中,并在后续版本中不断完善。Java NIO 的设计目的是为了克服传统Java ...

    java NIO推送实例

    Java NIO(New Input/Output)是Java标准库中提供的一种I/O模型,与传统的 Blocking I/O 不同,NIO 具有非阻塞的特性,可以提高在高并发场景下的处理能力。在这个实例中,"java NIO 消息推送实例" 旨在展示如何使用...

    Java NIO系列教程(一) Java NIO 概述

    ### Java NIO 系列教程(一):Java NIO 概述 #### 一、引言 Java NIO(New IO)是Java SE 1.4版本引入的一个新的I/O处理框架,它提供了比传统Java IO包更高效的数据处理方式。NIO的核心在于其三大组件:Channels...

    Java NIO 中英文版 + Pro Java 7 NIO.2

    Java NIO,全称为Non-Blocking Input/Output(非阻塞输入/输出),是Java平台中用于高效处理I/O操作的重要框架。它在Java 1.4版本中被引入,替代了传统的IO模型,提供了更高级别的I/O操作机制,以适应并发编程的需求...

    Java NIO Ron Hitchens著

    2. **缓冲区(Buffers)**:缓冲区是NIO的核心组件,用于存储和传输数据。与传统IO直接在流上读写不同,NIO需要先将数据存入Buffer,再从Buffer中读取或写入通道。 3. **选择器(Selectors)**:选择器允许单个线程...

    Java NIO学习资料+代码.zip

    Java NIO的核心组件主要包括通道(Channels)、缓冲区(Buffers)和选择器(Selectors): - **通道(Channels)**:通道是数据传输的途径,类似于传统IO中的流。Java NIO提供了多种通道,如FileChannel用于文件...

    NIO与零拷贝_javanio_nio和零拷贝_

    Java NIO(New IO)是Java 1.4引入的一个新特性,它是对传统IO模型的重大改进,提供了更高效的数据处理方式。NIO的核心概念包括通道(Channels)、缓冲区(Buffers)和选择器(Selectors)。它允许多个输入/输出操作...

    Java NIO详解及源码下载

    Java NIO(New IO)是Java 1.4版本引入的一个新模块,全称为Non-blocking Input/Output,它提供了一种不同于传统IO的编程模型,传统IO基于块I/O(Blocking I/O),而NIO则基于通道(Channels)和缓冲区(Buffers)...

    JAVA-NIO-DEMO

    Java NIO(New IO)是Java 1.4版本引入的一个新模块,它提供了一种不同于传统IO(基于字节流和字符流)的I/O操作方式。传统的IO模型是阻塞式的,而NIO的核心特点是非阻塞,这使得在处理大量并发I/O请求时更为高效。...

    JAVA NIO 异步通信客户端

    1. **Channels**: Channel是NIO的核心组件之一,它提供了一种从一个数据源(如文件、套接字或缓冲区)到另一个数据源传输数据的方式。SocketChannel是用于网络通信的通道,可以用于客户端与服务器建立TCP连接。 2. ...

    nio.rar_NIO_NIO-socket_java nio_java 实例_java.nio

    在Java NIO中,数据是以通道(Channels)和缓冲区(Buffers)的形式进行传输,而不是直接通过流。这种设计使得NIO能够同时处理多个输入/输出操作,从而实现多路复用。 标题“nio.rar_NIO_NIO-socket_java nio_java ...

Global site tag (gtag.js) - Google Analytics