java.nio.Buffer 中的 flip()方法

  • Post author:
  • Post category:java



在Java NIO编程中,对缓冲区操作常常需要使用  java.nio.Buffer中的 flip()方法。



Buffer 中的 flip() 方法涉及到 Buffer 中的c

apacity、position、limit

三个概念。




capacity:

在读/写模式下都是固定的,就是我们分配的缓冲大小(容量)。




positi


on:

类似于读/写指针,表示当前读(写)到什么位置。



l

imit:

在写模式下表示最多能写入多少数据,此时和

capacity

相同。在读模式下表示最多能读多少数据,此时和缓存中的实际



数据大小相同。













flip()


:Buffer有两种模式,写模式和读模式。在写模式下调用flip()之后,Buffer从写模式变成读模式。



那么limit就设置成了position当前的值(即当前写了多少数据),postion会被置为0,

以表示读操作从缓存的头开始读,

mark置为-1。




也就是说调用flip()之后,读/写指针position指到缓冲区头部,并且设置了最多只能读出之前写入的数据长度(而不是整个缓存的容量大小)






flip()源码:

    public final Buffer flip() {
        limit = position;
        position = 0;
        mark = -1;
        return this;
    }


实例代码(借用Java编程思想P552的代码):

package cn.com.newcom.ch18;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.RandomAccessFile;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;

/**
 * 获取通道
 * 
 * @author zhq
 * 
 */
public class GetChannel {
	private static final int SIZE = 1024;

	public static void main(String[] args) throws Exception {
		// 获取通道,该通道允许写操作
		FileChannel fc = new FileOutputStream("data.txt").getChannel();
		// 将字节数组包装到缓冲区中
		fc.write(ByteBuffer.wrap("Some text".getBytes()));
		// 关闭通道
		fc.close();

		// 随机读写文件流创建的管道
		fc = new RandomAccessFile("data.txt", "rw").getChannel();
		// fc.position()计算从文件的开始到当前位置之间的字节数
		System.out.println("此通道的文件位置:" + fc.position());
		// 设置此通道的文件位置,fc.size()此通道的文件的当前大小,该条语句执行后,通道位置处于文件的末尾
		fc.position(fc.size());
		// 在文件末尾写入字节
		fc.write(ByteBuffer.wrap("Some more".getBytes()));
		fc.close();

		// 用通道读取文件
		fc = new FileInputStream("data.txt").getChannel();
		ByteBuffer buffer = ByteBuffer.allocate(SIZE);
		// 将文件内容读到指定的缓冲区中
		fc.read(buffer);
		buffer.flip();// 此行语句一定要有
		while (buffer.hasRemaining()) {
			System.out.print((char) buffer.get());
		}
		fc.close();
	}
}


注意:buffer.flip();一定得有,如果没有,就是从文件最后开始读取的,当然读出来的都是byte=0时候的字符。通过buffer.flip();这个语句,就能把buffer的当前位置更改为buffer缓冲区的第一个位置。



版权声明:本文为hbtj_1216原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。