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

半兽人 发表于: 2017-02-22   最后更新时间: 2019-03-09 11:02:31  
{{totalSubscript}} 订阅, 6,027 游览

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

Buffer中的flip()方法涉及到Buffer中的CapacityPositionLimit三个概念。

  • Capacity:在读写模式下都是固定的,就是我们分配的缓冲大小。

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

  • Limit:在写模式下表示最多能写入多少数据,此时和Capacity相同。在读模式下表示最多能读多少数据,此时和缓存中的实际数据大小相同。

在写模式下调用 flip() 方法,那么limit就设置为了position当前的值(即当前写了多少数据),postion会被置为0,以表示读操作从缓存的头开始读。也就是说调用flip之后,读写指针指到缓存头部,并且设置了最多只能读出之前写入的数据长度(而不是整个缓存的容量大小)

实例代码(借用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;  

/** 
 * 获取通道 
 */  
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缓冲区的第一个位置。

更新于 2019-03-09
在线,13分钟前登录

查看java更多相关的文章或提一个关于java的问题,也可以与我们一起分享文章