流和通道之间的区别在于流是基于字节的,而通道的基于块的。通道会传送缓冲区中的数据块。
通道和缓冲区支持同一个对象的读、写。缓冲区的出现将IO的操作转移到操作系统上,极大提高速度。
缓冲区有4个关键部分
位置(position):缓冲区中将读取或写入的下一个位置,这个位置值从0开始计,最大值等于缓冲区的大小,使用position()方法。
容量 (capacity):缓冲区可以保存的元素的最大数目,容量值在创建缓冲区时设置,以后不能修改。使用capacity()方法。
限度(limit):缓冲区中可访问数据的末尾位置,只要不改变限制,就无法读/写超过这个位置的数据,即使缓冲区有更大的熔炼也没有用。使用limit()方法。
标记(mark):缓冲区中客户端指定索引。通过调用mark()可以将标记设置为当前位置,调用reset()可以将当前位置设置为所标记的位置。方法mark(),reset().
flip() 方法将限制设置为当前位置,位置设置为0
remaining()方法返回缓冲区中当前位置与限制之间的元素数,如果剩余的元素大于0,hasRemaing()返回true。
对应的代码如下
import java.nio.IntBuffer;
/** * 对于缓冲区进行操作*/
public class BufferTest {
public static void main(String[] args) {
IntBuffer buffer=IntBuffer.allocate(20);//创建缓冲区
//向缓冲区中添加数据
for(int i=0;i<10;i++){
buffer.put(i);
}
System.out.println("position---"+buffer.position());
System.out.println("limit---"+buffer.limit());
System.out.println("capacity-----"+buffer.capacity());
buffer.flip();//切换读取模式
System.out.println("-----------------");
System.out.println("position---"+buffer.position());
System.out.println("limit---"+buffer.limit());
System.out.println("capacity-----"+buffer.capacity());
if(buffer.hasRemaining()){
for(int j=0;j<buffer.remaining();j++){
System.out.print(buffer.get(j)+",");
}
}
System.out.println("\n-----------------");//读取对position的值不做改变
System.out.println("position---"+buffer.position());
System.out.println("limit---"+buffer.limit());
System.out.println("capacity-----"+buffer.capacity());
}
}
运行结果
position---10
limit---20
capacity-----20
-----------------
position---0
limit---10
capacity-----20
0,1,2,3,4,5,6,7,8,9,
-----------------
position---0
limit---10
capacity-----20