java新IO之Buffer

1、什么是java新IO

在jdk1.4之后呢,为了提高IO操作的性能,提供了一个新的开发包,NIO,此包定义在java.nio.*中。
在java中,已有的IO操作大部分都属于阻塞的操作,例如,键盘输入数据,必须一直等待用户输入数据,否则程序不能继续执行。另外,还有socket程序中服务器必须通过accept()方法等待用户连接,这就造成了大量的系统资源的浪费。所以呢在jdk1.4之后引入了新IO,在整个新IO的操作基本上都是使用缓冲区来完成的。

2、Buffer-->缓冲区

在基本io操作中,所有的操作都是以流的形式完成的,但是在新IO中所有的操作都是要使用到Buffer,所有的读写操作都是通过缓冲区完成的。


2、1 Buffer:

是一个线性的,有序的数据集,只能容纳某种特定类型数据。

在jdk api 1.6中是这样定义的:

public abstract class Bufferextends Object一个用于特定基本类型数据的容器。

缓冲区是特定基本类型元素的线性有限序列。除内容外,缓冲区的基本属性还包括容量、限制和位置:

缓冲区的容量 是它所包含的元素的数量。缓冲区的容量不能为负并且不能更改。

缓冲区的限制 是第一个不应该读取或写入的元素的索引。缓冲区的限制不能为负,并且不能大于其容量。

缓冲区的位置 是下一个要读取或写入的元素的索引。缓冲区的位置不能为负,并且不能大于其限制。

对于每个非 boolean 基本类型,此类都有一个子类与之对应。


2、2 Buffer的清除、反转和重绕

除了访问位置、限制、容量值的方法以及做标记和重置的方法外,此类还定义了以下可对缓冲区进行的操作:

clear() 使缓冲区为一系列新的通道读取或相对放置 操作做好准备:它将限制设置为容量大小,将位置设置为 0。

flip() 使缓冲区为一系列新的通道写入或相对获取 操作做好准备:它将限制设置为当前位置,然后将位置设置为 0。

rewind() 使缓冲区为重新读取已包含的数据做好准备:它使限制保持不变,将位置设置为 0

2、3 线程安全

多个当前线程使用缓冲区是不安全的。如果一个缓冲区由不止一个线程使用,则应该通过适当的同步来控制对该缓冲区的访问。

2、4 调用链

指定此类中的方法返回调用它们的缓冲区(否则它们不会返回任何值)。此操作允许将方法调用组成一个链;例如,语句序列

b.flip();
 b.position(23);
 b.limit(42);可以由以下更紧凑的一个语句代替 
 b.flip().position(23).limit(42);

3、Buffer中的方法

3、1 position方法

@ :public final int position()返回此缓冲区的位置。

@ :public final Buffer position(int newPosition)

设置此缓冲区的位置。如果标记已定义且大于新的位置,则丢弃该标记。

3、2 limit方法

@ :public final int limit()返回此缓冲区的限制。

@ :public final Buffer limit(int newLimit)

设置此缓冲区的限制。如果位置大于新的限制,则将它设置为新限制。如果

标记已定义且大于新限制,则丢弃该标记。


3、3 capacity 容量

public final int capacity() 返回此缓冲区的容量。