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

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

  Buffer 中的 flip() 方法涉及到 Buffer 中的capacity、position、limit三个概念。

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

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

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

                   数据大小相同。



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

那么limit就设置成了position当前的值(即当前写了多少数据),postion会被置为0,以表示读操作从缓存的头开始读,mark置为-1。

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

flip()源码:

  1. public final Buffer flip() {  
  2.     limit = position;  
  3.     position = 0;  
  4.     mark = -1;  
  5.     return this;  
  6. }  
    public final Buffer flip() {
        limit = position;
        position = 0;
        mark = -1;
        return this;
    }

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

  1. package cn.com.newcom.ch18;  
  2.   
  3. import java.io.FileInputStream;  
  4. import java.io.FileOutputStream;  
  5. import java.io.RandomAccessFile;  
  6. import java.nio.ByteBuffer;  
  7. import java.nio.channels.FileChannel;  
  8.   
  9. /** 
  10.  * 获取通道 
  11.  *  
  12.  * @author zhq 
  13.  *  
  14.  */  
  15. public class GetChannel {  
  16.     private static final int SIZE = 1024;  
  17.   
  18.     public static void main(String[] args) throws Exception {  
  19.         // 获取通道,该通道允许写操作  
  20.         FileChannel fc = new FileOutputStream(“data.txt”).getChannel();  
  21.         // 将字节数组包装到缓冲区中  
  22.         fc.write(ByteBuffer.wrap(”Some text”.getBytes()));  
  23.         // 关闭通道  
  24.         fc.close();  
  25.   
  26.         // 随机读写文件流创建的管道  
  27.         fc = new RandomAccessFile(“data.txt”“rw”).getChannel();  
  28.         // fc.position()计算从文件的开始到当前位置之间的字节数  
  29.         System.out.println(”此通道的文件位置:” + fc.position());  
  30.         // 设置此通道的文件位置,fc.size()此通道的文件的当前大小,该条语句执行后,通道位置处于文件的末尾  
  31.         fc.position(fc.size());  
  32.         // 在文件末尾写入字节  
  33.         fc.write(ByteBuffer.wrap(”Some more”.getBytes()));  
  34.         fc.close();  
  35.   
  36.         // 用通道读取文件  
  37.         fc = new FileInputStream(“data.txt”).getChannel();  
  38.         ByteBuffer buffer = ByteBuffer.allocate(SIZE);  
  39.         // 将文件内容读到指定的缓冲区中  
  40.         fc.read(buffer);  
  41.         buffer.flip();// 此行语句一定要有  
  42.         while (buffer.hasRemaining()) {  
  43.             System.out.print((char) buffer.get());  
  44.         }  
  45.         fc.close();  
  46.     }  
  47. }  
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缓冲区的第一个位置。


博客原文:http://blog.csdn.net/hbtj_1216/article/details/53129588

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值