Java NIO 缓冲技术详解

移动开发
缓冲区(buffer)是从即将写入通道(channel)或刚刚从通道中读出的一段数据。它是一个持有数据,并扮演NIO通道端点的对象。缓冲区为数据访问和读写过程提供正式机制。

缓冲区(buffer)是从即将写入通道(channel)或刚刚从通道中读出的一段数据。它是一个持有数据,并扮演NIO通道端点的对象。缓冲区为数据访问和读写过程提供正式机制。

它是NIO和老版Java I/O的一个主要区别。之前数据是直接从流(stream)中读写的,现在数据可以从缓冲区读写。在NIO中,通道是流的同义词。想要了解更多关于NIO通道的信息, 请阅读上一篇教程Java NIO通道

[[150477]]

NIO缓冲区特征

  • Java NIO的基本组成模块就是缓冲区。
  • 缓冲区提供一个固定大小的容器来读取数据。
  • 每个缓冲区都是可读的,但只有特定缓冲区才是可写的。
  • 缓冲区是通道的端点。
  • 只读缓冲区的内容是不可变的,但是其mark、position和limit都是可变的。
  • 默认情况下,缓冲区都不是线程安全的。

缓冲区类型

每种原始类型都有一个对应的缓冲区类型。所有的缓冲区类都实现了Buffer接口。最常用的缓冲区类型是ByteBuffer。如下是Java NIO包中提供的缓冲区类型。

  • ByteBuffer
  • CharBuffer
  • ShortBuffer
  • IntBuffer
  • LongBuffer
  • FloatBuffer
  • DoubleBuffer
  • MappedByteBuffer

缓冲区容量

缓冲区有固定大小,我们只能存储少于“固定大小”的数据,固定大小的值就叫做缓冲区的容量。缓冲区一旦填满则必须清空才能再次写入。容量一旦设置好,在缓存区的生命周期内都不会改变。

缓冲区界限

在写入模式,缓冲区的界限就等于容量。在读模式中,界限指向缓冲区***一个数据位的下一位。当缓冲区被写入时,界限一直递增。缓冲区的界限永远大于等于零且小于等于容量,0 <= 界限 <= 容量。

缓冲区位置

位置指向缓冲区当前地址。当缓冲区创建时,位置设置为零。读写过程中,位置会递增到下一个索引位置。位置永远在零和界限之间。

缓冲区标记

标记类似于给缓冲区设置书签。调用 mark() 时当前位置就被记录下来了,调用 reset() 时标记的位置就被恢复。

缓冲区flip、clear和rewind

缓冲区flip()

flip() 方法用来为缓冲区做准备,进行 get 操作或者准备新的写入序列。flip() 将界限设置到当前位置,然后将位置置为0。

缓冲区clear()

clear() 方法用来为缓冲区做准备,进行 put 操作或者准备新的读序列。clear() 将界限设置到容量的位置,并将位置置为0。

缓冲区rewind()

rewind() 方法用来再次读取已经获取过的数据。rewind()将缓冲区位置置0。

如何读NIO缓冲区

  1. 首先创建缓冲区,分配容量。Buffer有一个 allocate(size) 方法,可以返回一个 Buffer 对象。ByteBuffer byteBuffer = ByteBuffer.allocate(512);
  2. 进行 flip 操作,准备进行读操作。byteBuffer.flip();
  3. 下面可以读入数据。int numberOfBytes = fileChannel.read(byteBuffer);
  4. 接下来可以从缓冲区读取数据。char c = (char)byteBuffer.get();

如何写NIO缓冲区

  1. 创建缓冲区,分配容量。ByteBuffer byteBuffer = ByteBuffer.allocate(512); //容量设为512
  2. 写入数据。byteBuffer.put((byte) 0xff);

以上就是读写缓冲区的两个例子。缓冲区有很多种类型以及很多种读写方法。你可以根据使用要求进行选择。

原文链接: javapapers 翻译: ImportNew.com lemeilleur
译文链接: http://www.importnew.com/16721.html

责任编辑:倪明 来源: ImportNew
相关推荐

2011-12-07 14:57:44

JavaNIO

2011-12-14 16:30:42

javanio

2023-07-11 08:32:06

缓冲区Java

2011-03-31 10:41:49

BIONIOIO

2011-07-21 17:05:31

iPhone 屏幕 缓冲

2011-08-30 12:51:19

MySQL线程缓冲池

2011-12-15 09:55:47

javanio

2011-12-15 11:19:08

JavaNIO

2011-12-15 09:40:06

Javanio

2020-09-21 08:43:55

java

2011-12-07 14:41:51

JavaNIO

2011-12-07 16:12:29

JavaNIO

2011-12-15 10:10:33

Javanio

2011-12-15 10:43:20

JavaNIO

2022-02-22 08:00:48

JavaNIOBuffer

2011-12-14 10:31:43

2011-12-07 15:58:25

JavaNIO

2011-12-15 11:11:51

JavaNIO

2011-12-02 13:16:14

JavaNIO

2011-12-08 13:23:00

JavaNIO
点赞
收藏

51CTO技术栈公众号