今天在看《Java编程思想》的时候,碰到java.nio.Buffer flip()方法,不明白是干什么用的,于是就赶快查看中文API,API上面翻译的是:"反转此缓冲区。首先对当前位置设置限制,然后将该位置设置为零。如果已定义了标记,则丢弃该标记。";

  说实话,看了几遍,真还不明白说的是什么意思,于是就查看英文API,是这样说的:Flips this buffer. The limit is set to the current position and then the position is set to zero. If the mark is defined then it is discarded.,意思大概是这样的:调换这个buffer的当前位置,并且设置当前位置是0。说的意思就是:将缓存字节数组的指针设置为数组的开始序列即数组下标0。这样就可以从buffer开头,对该buffer进行遍历(读取)了。

  buffer中的flip方法涉及到bufer中的Capacity,Position和Limit三个概念。其中Capacity在读写模式下都是固定的,就是我们分配的缓冲大小,Position类似于读写指针,表示当前读(写)到什么位置,Limit在写模式下表示最多能写入多少数据,此时和Capacity相同,在读模式下表示最多能读多少数据,此时和缓存中的实际数据大小相同。在写模式下调用flip方法,那么limit就设置为了position当前的值(即当前写了多少数据),postion会被置为0,以表示读操作从缓存的头开始读。也就是说调用flip之后,读写指针指到缓存头部,并且设置了最多只能读出之前写入的数据长度(而不是整个缓存的容量大小)。
  
    实例代码(借用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 }

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

java.nio.Buffer.filp()方法的用法详解相关推荐

  1. java.nio.Buffer flip()方法

    碰到java.nio.Buffer flip()方法,不明白是干什么用的,于是就赶快查看中文API,API上面翻译的是:"反转此缓冲区.首先对当前位置设置限制,然后将该位置设置为零.如果已定 ...

  2. java的sort的用法_Java排序方法sort用法详解

    Java排序方法sort用法详解 发布于 2020-2-28| 复制链接 摘记: 本文实例为大家分享了java对数组.集合的排序方法,供大家参考,具体内容如下对数组的排序: ```java //对数组 ...

  3. getordefault java_Java map.getOrDefault()方法的用法详解

    Map.getOrDefault(Object key, V defaultValue)方法的作用是: 当Map集合中有这个key时,就使用这个key值: 如果没有就使用默认值defaultValue ...

  4. java 函数fun_c语言中fun用法详解_后端开发

    Java Dao层的作用_后端开发 Dao层叫数据访问层,属于一种比较底层,比较基础的操作,可以具体到对于某个表或某个实体的增删改查,其Dao层的作用是对数据库的访问进行封装,从而不涉及业务,实现解耦 ...

  5. java 返回值_Java方法返回值详解

    Java方法返回值详解 每个方法都是为了完成某个特定的功能,例如:登录功能.求和功能等,既然是功能,那么当这个功能完成之后,大多数情况下都会有一个结果的,比如,登录成功了或者失败了(true/fals ...

  6. Java NIO学习篇之缓冲区ByteBuffer详解

    定义: ByteBuffer是Buffer的实现类之一,是一个通用的缓冲区,功能要比其他缓冲区子类多.支持直接内存.是一个抽象类.子类实现是HeapByteBuffer(非直接缓冲区子类),Direc ...

  7. Java NIO学习篇之通道FileChannel详解

    定义: FileChannel是Java NIO对应于磁盘等存储设备文件操作的通道. 常用API详解: 获取FileChannel的API /** * 打开一个与文件的连接通道,用于进行文件操作. * ...

  8. Java NIO学习篇之通道Channel详解

    定义: Channel:通道,运输的介质,可以大致比喻成铁路的铁轨,连接着两个车站,而channel用于打开与IO设备的连接,比如磁盘,套接字等. 通道使用完需要关闭. 与传统IO的Stream比较: ...

  9. Java NIO学习篇之缓冲区CharSet详解

    定义: CharSet是对java nio编码解码的解决方案,专门负责字符的编码和解码. 编码:字符数组.字符串 ===> 字节数组. 解码:字节数组 ==> 字符数组.字符串 API详解 ...

  10. css3 实现圆角方法,CSS3 border-radius圆角的实现方法及用法详解

    这篇文章主要介绍了CSS3 border-radius圆角的实现方法及用法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下 以前想实现一个圆角是比较麻烦的,不 ...

最新文章

  1. MindSpore部署图像分割示例程序
  2. Centos7安装配置Xhgui
  3. SMS短信的C语言代码摘抄
  4. win10蓝牙允许设备连接到此计算机,Win7自由天空专业版系统配置蓝牙时“允许Bluetooth设备连接到此计算机”选项灰...
  5. c语言大数相加怎么写,大数相加
  6. Cake -- ACM解决方法
  7. 在每天下午五点使用计算机,邮件攻击主要是_每天下午5点使用计算机_apt的攻击目标一般不是...
  8. 第62课 捉迷藏 《小学生C++趣味编程》
  9. linux搭建环境软raid5
  10. 什么是数据库并发控制?数据库并发控制的主要方法是?
  11. 计算机为什么要区别C盘,D盘,E盘等?
  12. linux内核配置重置,linux内核配置--Boot options
  13. 对所谓原生软件的偏执
  14. 【转】Java杂谈(五)
  15. 期货价格与即期价格?
  16. bootstrap.min.css和bootstrap.min.js以及bootstrap.bundle.min.js下载,jquery各版本下载
  17. 电子元器件检测与维修从入门到精通视频教程
  18. 神推荐:酷站导航你值得拥有
  19. 成功解决hostname ‘xxx‘ doesn‘t uniquely match the interface ‘ens33‘ selected for the management bridge
  20. Y400本本SSD装win10与机械硬盘上的系统组成双系统

热门文章

  1. 【深入kotlin】 - 匿名函数、闭包和接收者
  2. php+后台+限制+登录次数,THINKSNS取消后台登录密码错误次数限制的办法详解
  3. matlab一阶导数图,一阶微分excel【如何用EXCEL做一阶导数图?】
  4. Unity用户手册-IL2CPP
  5. 【原创 深度学习与TensorFlow 动手实践系列 - 4】第四课:卷积神经网络 - 高级篇...
  6. Web前端开发技术课程大作业:基于HTML+CSS+JavaScript实现校园主题-萍乡田家炳中学校网站(1页)
  7. 深度学习图片数量较少扩充数据集的方法
  8. 九州海上牧云记,电视剧节奏太慢?教你如何看全集
  9. supervisor web页面访问
  10. BUUCTF刷题记录 Harley Quinn