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

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

大家好,又见面了,我是全栈君。

1.flip()方法用来将缓冲区准备为数据传出状态,这通过将limit设置为position的当前值,再将 position的值设为0来实现:

后续的get()/write()调用将从缓冲区的第一个元素开始检索数据,直到到达limit指示的位置。下面是使用flip()方法的例子:

// ... put data in buffer with put() or read() ...


buffer.flip(); // Set position to 0, limit to old position
while (buffer.hasRemaining()) 
// Write buffer data from the first element up to limit
channel.write(buffer);

2. flip()源码:

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

3.


实例代码(借用Java编程思想P552的代码): 
[java] view plain copy print?
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缓冲区的第一个位置。

转载于:https://my.oschina.net/u/2263272/blog/1556275

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/108085.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • python对象的不同参数集合「建议收藏」

    python对象的不同参数集合

    2022年3月12日
    38
  • vue 对象判断为空_Vue中可用的判断对象是否为空的方法

    vue 对象判断为空_Vue中可用的判断对象是否为空的方法vue有两个方法可用1.JSON.stringify(evtValue)=='{}’2.Object.keys(xxx).length==0js判断对象是否为空对象的几种方法1.将json对象转化为json字符串,再判断该字符串是否为”{}”vardata={};varb=(JSON.stringify(data)==”{}”);alert(b);//true2…

    2022年4月30日
    100
  • Postman安装与简单使用[通俗易懂]

    Postman安装与简单使用[通俗易懂]Postman使用参考文档:1.官方英文文档2.chrome插件整理的postman中文使用教程Postman一款非常流行的API调试工具。其实,开发人员用的更多。因为测试人员做接口测试会有更多选择,例如Jmeter、soapUI等。不过,对于开发过程中去调试接口,Postman确实足够的简单方便,而且功能强大。官方网站:https://www.getpostman.com/下载1>、postman下载地址:1.PostmanforMAC2.Postman..

    2022年9月15日
    0
  • OTSU算法(大津法阈值分割原理)

    写在前面大津法(OTSU)是一种确定图像二值化分割阈值的算法,由日本学者大津于1979年提出。从大津法的原理上来讲,该方法又称作最大类间方差法,因为按照大津法求得的阈值进行图像二值化分割后,前景与背景图像的类间方差最大。它被认为是图像分割中阈值选取的最佳算法,计算简单,不受图像亮度和对比度的影响,因此在数字图像处理上得到了广泛的应用。它是按图像的灰度特性,将图像分成背景和前景两部分。因方差…

    2022年4月18日
    183
  • gluster源码浅析

    gluster源码浅析gluster的volume是由一系列的translator组成的,translator就像输入输出流的堆栈式结构一样,由一个translator调用另一个translator,每个translator在运行时作为shared-object,根据不同的文件操作调用不同的函数.每个translator一般需要定义xlator_fops、xlator_cbks、init、fini、volume…

    2025年6月8日
    0
  • php 手机号正则_正则验证手机号是否合法

    php 手机号正则_正则验证手机号是否合法随着时代的发展,手机号码也在不断扩展。当我在进行PHP网页开发的时候,直接采用在网上找的手机号的正则表达式验证,结果后来测试的时候发现:当我使用的手机号177开头的进行输入时,竟然显示请输入正确的手机号,后来一看正则表达式是没有设定17开头的号码,于是又进行了学习,最终,得到了最新手机号的正则表达式验证(如下代码),以供自己和大家日后学习使用。//$phone存放手机号,$phoneErr存放手机号的错误信息//首先判定手机号不为空,然后进行正则表达式的手机号验证if(!empty($phone))

    2022年9月16日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号