网络I/o编程模型5 Nio之buffer的操作和常用方法

Posted 健康平安的活着

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了网络I/o编程模型5 Nio之buffer的操作和常用方法相关的知识,希望对你有一定的参考价值。

一 理解buffer的flip方法和clear方法

1.1 flip方法

1.2 clear方法

1.3 代码案例

1.代码

public class RandomBuffer 
    public static void main(String[] args) 
         Random random = new Random();
        IntBuffer buffer = IntBuffer.allocate(5);
        buffer.put(1);
        buffer.put(2);
        buffer.put(3);
        buffer.put(4);
        buffer.put(5);
        buffer.clear();
        while (buffer.hasRemaining()) 
             buffer.put(random.nextInt());
           
          buffer.flip();
        while (buffer.hasRemaining()) 
                  System.out.println(buffer.get());
         
    

2.没有执行clear方法前

3.执行clear方法后:

 二  buffer的案例操作

2.1 设置为只读buffer

1.代码

package com.ljf.netty.nio;

import java.nio.ByteBuffer;

/**
 * @ClassName: ReadOnlyBuffer
 * @Description: TODO
 * @Author: liujianfu
 * @Date: 2022/05/14 17:40:21
 * @Version: V1.0
 **/
public class ReadOnlyBuffer 
    public static void main(String[] args) 
        //创建一个buffer
        ByteBuffer buffer=ByteBuffer.allocate(64);
        for(int i=0;i<10;i++)
            buffer.put((byte)i);
        
        //读取切换,从写切换到读
         buffer.flip();
        //得到一个只读的Buffer
        ByteBuffer readOnlyBuffer=buffer.asReadOnlyBuffer();
        System.out.println("可读:"+readOnlyBuffer.getClass());
        while (readOnlyBuffer.hasRemaining())
            System.out.println("du:"+readOnlyBuffer.get());
        
        //这个时候再向里面添加,则报错!!!
        readOnlyBuffer.put((byte)100);
    

2.查看结果

 2.2 MappedByteBuffer在内存中修改内容

MappedByteBuffer 可让文件直接在内存(堆外内存)修改,操作系统不需要拷贝一次

1.代码

package com.ljf.netty.nio;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;

/**
 * @ClassName: RandomAccessFileDemo
 * @Description: TODO
 * @Author: liujianfu
 * @Date: 2022/05/14 17:58:16
 * @Version: V1.0
 **/
public class RandomAccessFileDemo 
    public static void main(String[] args) throws IOException 
        RandomAccessFile   randomAccessFile=new RandomAccessFile("d:/liu.txt","rw");
        //获取对应的通道
        FileChannel channel=randomAccessFile.getChannel();
        /**
        参数1:设置模式
         参数2:起始位置
         参数:加载到内存的内容个数,不是索引
        */
       MappedByteBuffer   mappedByteBuffer=channel.map(FileChannel.MapMode.READ_WRITE,0,10);
       //修改索引0,3 位置上的内容
       mappedByteBuffer.put(0,(byte)'t');
        mappedByteBuffer.put(3,(byte)'9');
        randomAccessFile.close();
        System.out.println("修改成功!!!");
    

2.看效果

 

以上是关于网络I/o编程模型5 Nio之buffer的操作和常用方法的主要内容,如果未能解决你的问题,请参考以下文章

网络i/o编程3 NIO

通俗编程——白话NIO之Buffer

网络I/o编程模型6 Nio之Selector以及NIO客户服务通讯

Java NIO之缓冲区

网络通信之 AIO 和 BIO和 NIO

[Java]I/O底层原理之三:NIO