【Netty】NIO 缓冲区 ( Buffer ) ( 缓冲区读写类型 | 只读缓冲区 | 映射字节缓冲区 )(二)

III . 映射字节缓冲区 ( MappedByteBuffer )


1 . 映射字节缓冲区 ( MappedByteBuffer ) : 在内存中修改文件 , 不需要将文件中的内容拷贝到内存中 , 再修改后 , 写回到文件 , 其性能提高了很多 ;



① 内存说明 : 修改文件的内存并不是堆内存 , 而是在堆外内存中 ;


② MappedByteBuffer 类结构 :


MappedByteBuffer 继承 ByteBuffer 抽象类 ;

MappedByteBuffer 本身也是抽象类 , 其有两个子类 , 分别是 DirectByteBuffer , DirectByteBufferR ;

③ 可操作区域 : fc.map(FileChannel.MapMode.READ_WRITE, 0, 10); 的 MappedByteBuffer 只能操作 从 0 索引开始的 10 个字节 , 即从 0 到 9 索引代表的字节 , 其中的 10 代表可操作性的字节个数 , 并不是索引值 ;



2 . 代码示例 :


package kim.hsl.nio;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;
public class MappedByteBufferDemo {
    public static void main(String[] args) {
        RandomAccessFile randomAccessFile = null;
        try {
            randomAccessFile = new RandomAccessFile("file.txt", "rw");
            FileChannel fc = randomAccessFile.getChannel();
            //FileChannel.MapMode.READ_WRITE : 指的是读写模式
            //0 : 将文件从 0 位置开始映射到内存中
            //10 : 将文件从 0 位置开始映射到内存中的大小
            //即 将 file.txt 文件从 0 开始的 10 字节映射到内存中
            MappedByteBuffer mappedByteBuffer = fc.map(FileChannel.MapMode.READ_WRITE, 0, 10);
            mappedByteBuffer.put(0, (byte) 'N');
            mappedByteBuffer.put(1, (byte) 'N');
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if(randomAccessFile != null)
                    randomAccessFile.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}



执行结果 : 在 IntelliJ IDEA 环境中打开没有刷新 , 在文件浏览器中打开 , “Hello World” 的前两位变成了 “NN” ;



【Netty】NIO 缓冲区 ( Buffer ) ( 缓冲区读写类型 | 只读缓冲区 | 映射字节缓冲区 )(二)

上一篇:POLARDB云数据库分布式存储引擎揭秘,POLARDB和MySql 5.6兼容性能对比


下一篇:lintcode循环数组之连续子数组求和