java.nio.Buffer 中的 flip()方法
2016年11月11日 16:29:15 牧_风 阅读数:9113 标签: javanioBufferflip更多
个人分类: Java NIO编程(Netty框架)
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.youkuaiyun.com/hbtj_1216/article/details/53129588
在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()源码:
-
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缓冲区的第一个位置。
本文深入解析了Java NIO编程中Buffer的flip()方法,详细阐述了其在转换Buffer从写模式到读模式过程中的作用,包括调整position、limit和mark等属性,确保数据正确读取。
5600

被折叠的 条评论
为什么被折叠?



