Java NIO 详解(二)缓存区与Buffer_JAVA_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > JAVA > Java NIO 详解(二)缓存区与Buffer

Java NIO 详解(二)缓存区与Buffer

 2013/10/16 12:47:48  SwordShadow  程序员俱乐部  我要评论(0)
  • 摘要:在基本IO操作中所有操作都是直接已流的形式完成的,而在NIO中所有的操作都要使用缓存区处理,且所有的读写操作都是通过缓存区完成的。缓存区(Buffer)是一个线性的、有序的数据集,只能容纳某种特定的数据类型Buffer的基本操作java.nio.Buffer是一个抽象类,常见方法如下publicfinalintcapacity()返回此缓存区的容量publicfinalintlimit()返回此缓存区的限制publicfinalBufferlimit(intnewLimit
  • 标签:详解 Java 缓存

? ? ? ?在基本IO操作中所有操作都是直接已流的形式完成的,而在NIO中所有的操作都要使用缓存区处理,且所有的读写操作都是通过缓存区完成的。缓存区(Buffer)是一个线性的、有序的数据集,只能容纳某种特定的数据类型

? ??

? ? ? ? Buffer的基本操作

? ? ? ? java.nio.Buffer是一个抽象类,常见方法如下

? ??

public final int capacity()

返回此缓存区的容量

public final int limit()

返回此缓存区的限制

public final Buffer limit(int newLimit)

设置此缓存区的限制

public final int position()

返回缓存区的操作位置

public final Buffer flip()

重设缓存区,在写入之前调用,改变缓冲的指针

public final boolean hasRemaining()

判断当前位置和限制之间是否有内容

?

? ? ? ? 各种数据类型的缓冲区类

? ??

java.nio.ByteBuffer

存储字节的Buffer

java.nio.IntBuffer

储存整形的Buffer

?

? ? ? ? 更多参考api

? ??

? ? ? ? 演示缓冲区的操作

? ??

class="java" name="code">import java.nio.IntBuffer;

public class IntBufferDemo01 {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		IntBuffer buf = IntBuffer.allocate(10);
		System.out.println("1、写入数据之前的position、limit和capacity");
		System.out.println(buf.position()+","+buf.limit()+","+buf.capacity());
		int[] temp ={1,3,5};
		buf.put(2);
		buf.put(temp);
		System.out.println("2、写入数据之后的position、limit和capacity");
		System.out.println(buf.position()+","+buf.limit()+","+buf.capacity());
		buf.flip();  //重设缓冲区     limit设置为position,position设置为0
		System.out.println("3、准备输出数据时的position、limit和capacity");
		System.out.println(buf.position()+","+buf.limit()+","+buf.capacity());
		System.out.println("缓冲区的内容:");
		while(buf.hasRemaining()){
			int x = buf.get();
			System.out.print(x+"、");
		}
	}
}

? ? ? ? ? 输出:

? ?

1、写入数据之前的position、limit和capacity
0,10,10
2、写入数据之后的position、limit和capacity
4,10,10
3、准备输出数据时的position、limit和capacity
0,4,10
缓冲区的内容:
2、1、3、5、

???

??

? ? ? ??创建子缓冲区

? ? ? ? 可以使用各个缓冲区的类的slice()方法从一个缓冲区中创建一个新的子缓冲区,子缓冲区与原缓冲区中的各个部分数据可以共享

? ??

import java.nio.IntBuffer;

public class IntBufferDemo02 {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		IntBuffer buf = IntBuffer.allocate(10);
		IntBuffer sub = null;
		for (int i = 0; i < 10; i++) {
			buf.put(2*i+1);
		}
		buf.position(2);
		buf.limit(6);
		sub = buf.slice();
		for (int i = 0; i < sub.capacity(); i++) {
			int temp = sub.get(i);
			sub.put(temp-1);
		}
		buf.flip();
		buf.limit(buf.capacity());
		System.out.println("主缓存区中的内容");
		while(buf.hasRemaining()){
			int x = buf.get();
			System.out.print(x+"、");
		}
	}

}

? ? ? ? 输出:?

? ??

主缓存区中的内容
1、3、4、6、8、10、13、15、17、19、

?

?

? ? ? ?创建直接缓冲区

? ? ? ?在缓冲区操作类中,只有ByteBuffer可以创建直接缓冲区,使用直接缓冲区的时候,JVM虚拟机会直接在此缓冲区上执行 本机IO操作,也就是说,在每次调用基础操作系统的一个本机IO之前或者之后,虚拟机都会避免将缓冲区的内容复制到中间缓冲区(或者从中间缓冲区复制内容)。

? ? ? ?创建直接缓冲区方法如下:

? ? ??

public static ByteBuffer allocateDirect(int capacity)

? ? ?

? ??

import java.nio.ByteBuffer;

public class ByteBufferDemo01 {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		ByteBuffer buf = null;
		buf = ByteBuffer.allocate(10);
		byte[] temp ={1,3,5,7,9};
		buf.put(temp);
		buf.flip();
		System.out.println("缓冲区的内容:");
		while(buf.hasRemaining()){
			int x = buf.get();
			System.out.print(x+"、");
		}
	}

}

? ? ? ? 输出:

缓冲区的内容:
1、3、5、7、9、

?

? ?

?

发表评论
用户名: 匿名