Java NIO流

上篇博客中了解Java IO,这篇博客重点介绍Java NIO,着重学习 NIO 中的流。

Java NIO流_第1张图片


Java NIO 是 Java New I/O 的简称。其特性如下:

1、为所有的原始类型提供(buffer)缓存支持。

2、字符集编码解码解决方案。

3、Channel 一个新的原始I/O抽象。

4、支持锁和内存映射文件的文件访问接口。

5、提供多路(non-blocking)非阻塞式的高伸缩性网络 I/O。

NIO创建的目的 是为了让Java程序员可以实现高速而无需编写自定义的本机代码。NIO将最耗时的I/O操作(即填充和提取缓冲区)转移回操作系统,因而可以极大的提高速度。


在JDK1.4中原来的I/O包和NIO已经很好的集成了,Java.io.* 已经以NIO为基础重新实现了,所以它现在可以利用NIO的一些特性。

缓冲区是包在一个对象内的基本数据元素数组。buffer类相比一个简单数组的优点是它将关于数据的数据内容和信息包含在一个单一的对象中。buffer 类以及它专有的子类定义了一个用于处理数据缓冲区的API 。所有的缓冲区都具有四个属性来提供关于其所包含的数据元素的信息

1、容量(Capacity)

缓冲区能够容纳的数据元素的最大数量。这一容量在缓冲区创建时被设定,并且永远不能被改变。代表缓冲区的最大容量(一般新建一个缓冲区的时候,limit的值和capacity的值默认是相等的)

2、上界(Limit)

缓冲区的第一个不能被读或写的元素。缓冲区中现存元素的计数。所有对Buffer读写操作都会以limit变量的值作为上限。

3、位置(Position)

下一个要被读或写的元素的索引。位置会自动由相应的get()和put()函数更新。

4、标记(Mark)

一个备忘位置。调用Mark()来设定 mark = postion。调用reset()设定position = mark。标记在设定前是未定义的(undefined)。代表对缓冲区进行读写时,当前游标的位置。


flip、rewind、clear这三个方法便是用来设置这些值的。
flip方法
反转缓冲区。首先将限制设置为当前位置,然后将位置设置为 0。如果已定义了标记,则丢弃该标记。 常与compact方法一起使用。通常情况下,在准备 从缓冲区中读取数据 时调用flip方法。
public   final  Buffer flip() {
 limit = position;
 position = 0;
 mark = -1;
  return   this ;
}
rewind方法
rewind() 使缓冲区为重新读取已包含的数据做好准备:它使限制保持不变,将位置设置为 0。( 也就是相当于选取当前缓冲去总的全部有效数据 )和clear()类似,只是不改动限制.

public   final  Buffer rewind() {
 position = 0;
 mark = -1;
  return   this ;
}
clear方法
clear方法将缓冲区清空,一般是在 重新写缓冲区 时调用。

public   final  Buffer clear()
{
    position = 0;  //重置当前读写位置
    limit = capacity; 
    mark = -1;   //取消标记
     return   this ;
}

缓冲区的分类:(注:非布尔类型)

1、字节缓冲区 ByteBuffer

2、字符缓冲区 CharBuffer

3、双精浮点型(double)缓冲区 DoubleBuffer

4、单精浮点型(float)缓冲区 FloatBuffer

5、整型(int)缓冲区 IntBuffer

6、长整型(long)缓冲区 LongBuffer

7、短整型(short)缓冲区 ShortBuffer

上述各类型的缓冲区都提供了读和写的方法 get 和 put 方法,也提供了一些批量的get 和 put 方法。而且缓冲区可以通过allocation创建,此方法通过wrapping 将一个现有(数据类型)数组包装到缓冲区中来为缓冲区内容分配空间,或者通过创建现有字节缓冲区的视图来创建。

缓冲区的操作:

1、存 put

2、取 get

复制缓冲区

可以创建描述从外部存储到数组中的数据元素的缓冲区对象。但是缓冲区不限于管理数组中的外部数据。它们也能管理其他缓冲区中的外部对象。Duplicate()函数创建了一个与原始缓冲区相似的新缓冲区。两个缓冲区共享数据元素,拥有同样的容量,但每个缓冲区拥有各自的位置,上界和标记属性。对一个缓冲区内的数据元素所做的改变会反映在另一个缓冲区上。这一副本缓冲区具有与原始缓冲区同样的数据视图。如果原始的缓冲区为只读,或者为直接缓冲区,新的缓冲区将继承这些属性。需要注意的是,复制一个缓冲区会创建一个新的buffer对象,但并不复制数据。原始缓冲区和副本都会操作同样的数据元素。










你可能感兴趣的:(Java NIO流)