Java中的IO流二

Java的IO相关内容。

缓冲区

java.nio包下面定义了一些缓存区类,基类是Buffer类,是一个抽象类。缓存区有3个状态变量,position、limit和capacity,position是指读写头的位置,limit是指读写头能够读到或写到的位置,capacity是指缓冲区的大小,缓冲区也是支持做标记,所以也有一个mark的变量,它们的关系是mark <= position <= limit <= capacity,mark大于position时,mark就会失效。

Buffer

Buffer的子类都会提供两种get方法和put方法用来对缓冲区进行操作,Buffer自己提供了基本的对缓冲区状态的查询和设置操作,缓冲区的capacity是在构造的时候给定的,之后就无法修改,其他的都可以设置。

1
2
3
4
5
flip() // limit = position;position = 0;mark = -1; 翻转操作,之前往缓存写,现在可以读取之前写入的数据;之前是从缓存里读,现在可以写入覆盖之前的数据
hasRemaining() // position < limit 是否还有数据可读
remaining() // limit - position 可读数据个数
rewind() // position = 0;mark = -1; 可以重读或者重写
clear() // 清空缓存区

Buffer子类

Buffer有一些针对基本数据类型的缓冲区子类:ByteBuffer,CharBuffer,ShortBuffer,IntBuffer,LongBuffer,FloatBuffer,DoubleBuffer。这些都又类似的方法,一些put个get方法,这些方法都是操作对应的基本数据类型。而ByteBuffer有针对其他基本数据类型的方法,ByteBuffer是直接操作字节的,所以ByteOrder对其是有影响的,ByteOrder有两个常量,BIG_EDIAN和LITTLE_EDIAN。大端表示字节的高位在前,小端表示字节的地位在前,ByteBuffer有对应的asXXXBuffer()方法来将ByteBuffer转换成其他Buffer。

Buffer的子类的一些方法如下:

1
2
3
4
5
allocate(capacity) // 创建一个指定容量的缓冲区
wrap(array) // 通过对应的数组来创建缓冲区
compact() // 压缩,将未读的数据移到缓冲区的前面,position=remain,limit=capacity
duplicate() // 复制一个缓冲区对象,共享同一个缓冲区,各自管理各自的position,limit
slice() // 使用未读数据来创建一个缓冲区对象,共享同一个缓冲区,新缓冲区的position=0,capacity和limit=原缓冲区的remain