您当前的位置: 首页 > 

java持续实践

暂无认证

  • 10浏览

    0关注

    746博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

bytebuffer 使用demo

java持续实践 发布时间:2022-07-31 14:43:18 ,浏览量:10

pom文件

    
        
            org.projectlombok
            lombok
            1.16.18
        
    
package cn.itcast.netty.c1;

import lombok.extern.slf4j.Slf4j;

import java.io.FileInputStream;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;

/**
 * 类名称:TestByteBuffer
 * @author: https://javaweixin6.blog.csdn.net/
 * 创建时间:2022-07-31 13:42
 */
@Slf4j
public class TestByteBuffer {

    public static void main(String[] args) {
        try (FileChannel channel = new FileInputStream("data.txt").getChannel()){
                // 准备缓冲区  缓冲10个字节
            ByteBuffer buffer = ByteBuffer.allocate(10);

            while (true) {
                // 从channel 读取数据, 向buffer写入
                int len = channel.read(buffer);
                log.debug("读取到的字节数{}", len);
                if (len == -1) {
                    break;
                }
                // 切换到buffer的读模式 .
                buffer.flip();
                // 判断是否还有剩余未读取数据
                while (buffer.hasRemaining()) {
                    // 一次读一个字节.
                    byte b = buffer.get();
                    // 打印buffer的内容
                 //   System.out.println((char)b);
                    log.debug("实际字节{}", (char)b);
                }
                // 切换为写模式
                buffer.clear();
            }
        } catch (IOException e) {
        }
    }
}

创建一个txt文件, 放在项目最外层, 内容如下, 有13个字节. 在这里插入图片描述 控制台打印如下:

14:30:30 [DEBUG] [main] c.i.n.c.TestByteBuffer - 读取到的字节数10
14:30:30 [DEBUG] [main] c.i.n.c.TestByteBuffer - 实际字节1
14:30:30 [DEBUG] [main] c.i.n.c.TestByteBuffer - 实际字节2
14:30:30 [DEBUG] [main] c.i.n.c.TestByteBuffer - 实际字节3
14:30:30 [DEBUG] [main] c.i.n.c.TestByteBuffer - 实际字节4
14:30:30 [DEBUG] [main] c.i.n.c.TestByteBuffer - 实际字节5
14:30:30 [DEBUG] [main] c.i.n.c.TestByteBuffer - 实际字节6
14:30:30 [DEBUG] [main] c.i.n.c.TestByteBuffer - 实际字节7
14:30:30 [DEBUG] [main] c.i.n.c.TestByteBuffer - 实际字节8
14:30:30 [DEBUG] [main] c.i.n.c.TestByteBuffer - 实际字节9
14:30:30 [DEBUG] [main] c.i.n.c.TestByteBuffer - 实际字节0
14:30:30 [DEBUG] [main] c.i.n.c.TestByteBuffer - 读取到的字节数3
14:30:30 [DEBUG] [main] c.i.n.c.TestByteBuffer - 实际字节a
14:30:30 [DEBUG] [main] c.i.n.c.TestByteBuffer - 实际字节b
14:30:30 [DEBUG] [main] c.i.n.c.TestByteBuffer - 实际字节c
14:30:30 [DEBUG] [main] c.i.n.c.TestByteBuffer - 读取到的字节数-1

通过控制台看到, 第一次读取到了缓存的10个字节, 1到0. 挨个把1到0打印了出来. 第二次读取了3个字节, a到c, 挨个打印了出来.

总结步骤:

  1. 向buffer 写入数据: channel.read(buffer)
  2. 调用flip() 切换到读模式
  3. 从buffer 读取数据, 调用buffer.get()
  4. 调用clear获取compact() 切换到写模式
  5. 重复 1-4步骤
关注
打赏
1658054974
查看更多评论
立即登录/注册

微信扫码登录

0.0401s