`
hhyyllgg
  • 浏览: 27484 次
  • 性别: 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视频教程

    01-Java NIO-课程简介.mp4 02-Java NIO-概述.mp4 03-Java NIO-Channel-概述.mp4 04-Java NIO-Channel-FileChannel(介绍和示例).mp4 05-Java NIO-Channel-FileChannel详解(一)....15-Java NIO-Buffer-分配和读写数据.mp4

    java nio中文版

    java NIO是 java New IO 的简称,在 jdk1.4 里提供的新 api 。 Sun 官方标榜的特性如下: – 为所有的原始类型提供 (Buffer) 缓存支持。 – 字符集编码解码解决方案。 – Channel :一个新的原始 I/O 抽象。 – 支持...

    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系列教程 Java NIO Channel Buffer Selector SocketChannel

    详细了解JAVA NIO之Buffer(缓冲区)

    主要介绍了JAVA NIO之Buffer(缓冲区)的相关资料,文中讲解非常细致,帮助大家更好的学习JAVA NIO,感兴趣的朋友可以了解下

    Java NIO 英文文字版

    The NIO package includes many things that have been missing from previous editions of Java that are critical to writing high-performance, large-scale applications: improvements in the areas of buffer ...

    Java NIO Buffer过程详解

    主要介绍了Java NIO Buffer过程详解,缓冲区在java nio中负责数据的存储。缓冲区就是数组。用于存储不同数据类型的数据。,需要的朋友可以参考下

    java nio教程pdf

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

    Java+NIO+中文版.pdf

    java nio作者倾力所写的简单易懂的NIO学习指南,让你顺利拿下NIO开发,包括了NIO中的Buffer,Channel,Selector的介绍,理论&代码都有,是你学习NIO的不二法宝~

    <<java nio>> javaNIO的使用

    javaNIO的使用,讲述了新IO,Buffer ,channel的核心概念

    nio.rar_FastCopyFile.java_NIO_UseFloatBuffer.java_java nio_文件锁

    Java NIO 源码适合初学者,里面包括通道和Buffer的基本适用,以及文件锁,和内存文件映射等等

    尚硅谷Java视频_NIO 视频教程

    尚硅谷_NIO_缓冲区(Buffer)的数据存取 ·03. 尚硅谷_NIO_直接缓冲区与非直接缓冲区 ·04. 尚硅谷_NIO_通道(Channel)的原理与获取 ·05. 尚硅谷_NIO_通道的数据传输与内存映射文件 ·06. 尚硅谷_NIO_分散读取与聚集...

    Java NIO(通道+缓冲区+选择器)

    Java NIO通道:通道基础、文件通道、Socket通道、工具类 Java NIO缓冲区:基础、缓冲区(Buffer)、创建缓冲区、直接缓冲区(DirectByteBuffer) Java NIO选择器:核心概念、选择器使用、Demo、选择器深入、

    Java-NIO-Programming-Cookbook(含源码)

    Java-NIO-Programming-Cookbook英文版和配套源代码。有一个使用DirectByteBuffer和Non-Direct Buffer文件读取速度的对比实验程序和测试结果。

    Java IO, NIO and NIO.2(Apress,2015)

    Java I/O, NIO, and NIO.2 is a power-packed book that accelerates your mastery of Java's various I/O APIs. In this book, you'll learn about classic I/O APIs (File, RandomAccessFile, the stream classes ...

    浅谈java中nio的使用方式

    NIO其核心概念包括Channel,Selector,SelectionKey,Buffer.

    Java NIO 网络编程初探

    Java NIO 网络编程初探 1. Java NIO Java 1.4 版本添加了一个新的IO API,称为NIO(New IO)。...Java IO 的操作都是基于输入输出流的,而NIO则是基于Channel和Buffer的,数据先被读取到Buffer中,然后再进

    javasnmp源码-nio-learn:JavaNIO使用示例,NIO的使用,TCP,UDP的简单示例

    Buffer是数据的容器,在nio中负责数据的存取,java为不同数据类型提供了相对应的缓冲区类型 如:ByteBuffer、CharBuffer、ShortBuffer、IntBuffer、LongBuffer、FloatBuffer 、DoubleBuffer 等。 Buffer的基本使用 ...

Global site tag (gtag.js) - Google Analytics