`
hhyyllgg
  • 浏览: 28266 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

java NIO之Buffer基础

    博客分类:
  • java
 
阅读更多

这段时间空闲下来,学习了下nio的一些东西,记录下来,以加深自己的理解和记忆。

Java NIO 由以下几个核心部分组成:
  • Channels
  • Buffers
  • Selectors

虽然Java NIO 中除此之外还有很多类和组件,但在我看来,Channel,Buffer 和 Selector 构成了核心的API。
Buffers 缓冲区,以及缓冲区如何工作,是所有 I/O 的基础。所谓“输入/输出”讲的无非就是把数据移 进或移出缓冲区。

概念:实际上缓冲区就是一个包含在对象里的基本数据元素数组
属性:所有的缓冲区都具有四个属性来提供关于其所包含的数据元素的信息。它们是:
  • 容量(Capacity) 缓冲区能够容纳的数据元素的最大数量。这一容量在缓冲区创建时被设定,并且永远不能被改变。
  • 上界(Limit) 缓冲区的第一个不能被读或写的元素。或者说,缓冲区中现存元素的计数。
  • 位置(Position) 下一个要被读或写的元素的索引。位置会自动由相应的get( )和put( )函数更新。
  • 标记(Mark) 一个备忘位置。调用mark( )来设定mark = postion。调用reset( )设定position = mark。标记在设定前是未定义的(undefined)。
看下图 新创建一个ByteBuffer



我们通过 ByteBuffer.allocate(11) 方法创建一个 10 个 byte 的数组缓冲区,初始状态如上图所示,position 的位置为 0,capacity 和 limit 默认都是数组长度。当我们写入 5 个字节时位置变化如下图所示:




这时如果我们想在不丢失位置的情况下进行一些修改,比如说将hello更改为MelloW
可以这样实现
buffer.put(0,(byte)'M').put((byte)'w');
修改后的Buffer图像如下图




如果我们想将缓冲区的 5 个字节数据写入 Channel 通信信道,我们需要调用 byteBuffer.flip() 方法,数组的状态又发生如下变化




还有一个方法 rewind (),会重置position的位置为0 但不改变limit的位置,可以使用rewind()后退,重读已经被翻转的缓冲区中的数据。


  • 一旦读完Buffer中的数据,需要让Buffer准备好再次被写入。可以通过clear()或compact()方法来完成。
  • 如果调用的是clear()方法,position将被设回0,limit被设置成 capacity的值。换句话说,Buffer 被清空了。但这个时候Buffer中的数据并未清除,只是这些标记告诉我们可以从哪里开始往Buffer里写数据。

看下面代码
public static void main(String[] argv) throws Exception {
		CharBuffer buffer = CharBuffer.allocate(20);
		System.out.println("初始化时候:position="+buffer.position()+" limit="+buffer.limit());
		fillBuffer(buffer,"hello");
		System.out.println("填入hello以后:position="+buffer.position()+" limit="+buffer.limit());
		buffer.put(0,'M').put('w');
		System.out.println("修改成Mellow后:position="+buffer.position()+" limit="+buffer.limit());
		buffer.flip();
		System.out.println("翻转后:position="+buffer.position()+" limit="+buffer.limit());
		buffer.clear();
		System.out.println("clear后:position="+buffer.position()+" limit="+buffer.limit());
		buffer.position(0);
		while (buffer.hasRemaining()) {
			System.out.println(buffer.get());
		}
	}private static void fillBuffer(CharBuffer buffer) {
		String string = "MY TEST BUFFER";
		for (int i = 0; i < string.length(); i++) {
			buffer.put(string.charAt(i));
		}
	}

结果:
初始化时候:position=0 limit=20
填入hello以后:position=5 limit=20
修改成Mellow后:position=6 limit=20
翻转后:position=0 limit=6
clear后:position=0 limit=20
M
e
l
l
o
w

从上面例子可以看出clear后实际上buffer中数据还是存在的
如果Buffer中有一些未读的数据,调用clear()方法,数据将“被遗忘”,意味着不再有任何标记会告诉你哪些数据被读过,哪些还没有。
如果Buffer中仍有未读的数据,且后续还需要这些数据,但是此时想要先先写些数据,那么使用compact()方法。
看下面代码:
public static void compactTest(){
		CharBuffer buffer = CharBuffer.allocate(11);
		fillBuffer(buffer,"hello world");
		buffer.position(6);
		buffer.compact();
		buffer.put("j");
		buffer.put("a");
		buffer.put("v");
		buffer.put("a");
		buffer.flip();
		while (buffer.hasRemaining()) {
			System.out.print(buffer.get());
		}
	}
打印结果为worldjava

compact()方法将所有未读的数据拷贝到Buffer起始处。然后将position设到最后一个未读元素正后面。limit属性依然像clear()方法一样,设置成capacity。现在Buffer准备好写数据了,但是不会覆盖未读的数据。
其它还有mark()与reset() equals()等方法 就不一一介绍了。













  • 大小: 6 KB
  • 大小: 7.2 KB
  • 大小: 7.2 KB
  • 大小: 7.3 KB
0
2
分享到:
评论

相关推荐

    Java NIO实战开发多人聊天室

    12-Java NIO-Buffer-概述.mp4 13-Java NIO-Buffer-基本使用.mp4 14-Java NIO-Buffer-三个属性和类型.mp4 17-Java NIO-Buffer-缓冲区分片.mp4 18-Java NIO-Buffer-只读缓冲区.mp4 19-Java NIO-Buffer-直接缓冲区.mp4 ...

    JavaNIO chm帮助文档

    Java NIO系列教程(三) Buffer Java NIO系列教程(四) Scatter/Gather Java NIO系列教程(五) 通道之间的数据传输 Java NIO系列教程(六) Selector Java NIO系列教程(七) FileChannel Java NIO系列教程(八) ...

    Java NIO英文高清原版

    Java NIO,全称为Non-Blocking Input/Output(非阻塞输入/输出),是Java平台中用于替代标准I/O(BIO)模型的一种新机制。NIO在Java 1.4版本引入,提供了更高效的数据处理和通道通信方式,特别适用于高并发、大数据...

    java NIO 视频教程

    Java NIO(New IO)是一个可以替代标准Java IO API的IO API(从Java 1.4开始),Java NIO提供了与标准IO不同的IO工作方式。 Java NIO: Channels and Buffers(通道和缓冲区) 标准的IO基于字节流和字符流进行操作的,...

    java NIO技巧及原理

    **Java NIO基础概念:** 1. **通道(Channel)**:类似于流,但可以双向传输数据,如FileChannel、SocketChannel等。 2. **缓冲区(Buffer)**:用于在通道和应用程序之间存储数据,提供了更高效的访问方式。 3. **...

    java nio 包读取超大数据文件

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

    Java语言基础教程-Java NIO流篇2

    首先,我们要理解Java NIO的核心组件之一——流。在Java的IO体系中,流是数据传输的抽象,它代表了数据的流向,可以是输入流(InputStream)或输出流(OutputStream)。然而,NIO中的流与传统的IO流有所不同,它们...

    Java NIO Socket基本

    缓冲区类型包括ByteBuffer、CharBuffer、IntBuffer、DoubleBuffer等,它们都继承自`java.nio.Buffer`。 3. **选择器(Selector)**:用于监听多个通道的事件(如连接就绪、数据到达等),当某个通道准备好进行读写...

    java NIO实例

    Java NIO,全称为Non-Blocking Input/Output(非阻塞输入/输出),是Java从1.4版本开始引入的一种新的I/O模型,它为Java应用程序提供了更高效的数据传输方式。传统的Java I/O模型(BIO)在处理大量并发连接时效率较...

    Java.NIO资源下载资源下载

    根据提供的文件信息,我们可以提取并总结出关于Java NIO(New Input/Output)的重要知识点。 ### Java NIO 概述 Java NIO 是 Java 平台的一个重要特性,首次出现在 Java 1.4 版本中。它为 Java 开发者提供了一套...

    java nio 读文件

    Java NIO(New IO)是Java 1.4版本引入的一个新模块,它提供了一种不同于标准Java IO API的处理I/O操作的方式。NIO的主要特点是面向缓冲区,非阻塞I/O,以及选择器,这些特性使得NIO在处理大量并发连接时表现出更高...

    java NIO详细教程

    - **缓冲区(Buffer)**:缓冲区是Java NIO中数据读写的基础单元。根据数据类型的不同,Java NIO 提供了多种缓冲区: - **ByteBuffer**:用于基本字节数据的缓冲。 - **CharBuffer**:用于字符数据的缓冲。 - **...

    Java NIO Buffer过程详解

    Java NIO Buffer 过程详解 Java NIO Buffer 是 Java NIO 中的一种重要组件,负责数据的存储和传输。缓冲区是数组,用于存储不同数据类型的数据。在与 NIO 通道交互时,Java NIO Buffer plays a crucial role. 基本...

    一个java NIO的例子

    Java NIO,全称为Non-Blocking Input/Output(非阻塞输入/输出),是Java标准库提供的一种替代传统I/O模型的新技术。在传统的Java IO模型中,读写操作是阻塞的,即当调用read或write方法时,线程会等待数据准备好或...

    java nio入门学习,两个pdf

    Java NIO定义了多个Buffer类,如ByteBuffer、CharBuffer、IntBuffer等,每个Buffer都有容量、位置、限制等属性,可以进行读写操作。 3. **选择器(Selectors)**:选择器用于监控多个通道的状态,当某个通道准备就绪...

Global site tag (gtag.js) - Google Analytics