Java网络编程(7)MappedByteBuffer

前言

前面学会了Buffer和Channel
这里学习一个特殊的Buffer:MappedByteBuffer

概念

ByteBuffer分两种模式:直接与间接
间接的就是我们普通用的ByteBuffer,叫HeapByteBuffer,在JVM堆上,处理byte数组,但堆内存是有限的,当需要处理大文件时

使用直接模式:MappedByteBuffer,文件映射,直接调用操作系统底层的缓存(虚拟内存),没有JVM和系统之间的复制操作,MappedByteBuffer可以直接在系统底层操作文件
在这里插入图片描述

结构

在这里插入图片描述
MappedByteBuffer是一个抽象类,它的实现类是DirectByteBuffer,DirectByteBufferR继承DirectByteBuffer类

操作

FileChannel提供了map方法来把文件映射为MappedByteBuffer

可以通过RandomAccessFile随机访问文件得到FileChannel,这里“随机”是指可以跳转到文件的任意位置处读写数据

package com.company.NIOBuffer;

import java.io.RandomAccessFile;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;

public class MappedBuffer {
    public static void main(String[] args) throws Exception {
        //RandomAccessFile随机访问文件
        //rw设置读写
        RandomAccessFile randomAccessFile = new RandomAccessFile("BasicFileChannel","rw");
        //创建FileChannel
        FileChannel fileChannel = randomAccessFile.getChannel();
        //map映射
        MappedByteBuffer mappedByteBuffer=fileChannel.map(FileChannel.MapMode.READ_WRITE,0,5);
        mappedByteBuffer.put(0,(byte)'w');
        mappedByteBuffer.put(3,(byte)6);

    }
}

原文件:
在这里插入图片描述
修改后(去文件夹打开):
在这里插入图片描述

map映射方法

FileChannel提供了map方法来把文件映射为MappedByteBuffer,具体实现在FileChannel的实现类FileChannelImpl类
在这里插入图片描述
它的三个参数的作用:

  1. MapMode
    设置读写模式,有3个值
    READ_ONLY仅读
    READ_WRITE读写
    PRIVATE写时拷贝(copy-on-write)的映射:产生一个私有的数据拷贝并且该拷贝中的数据只有MappedByteBuffer实例可以看到,该过程不会对底层文件做任何修改

在这里插入图片描述

  1. Long var2
    可以直接修改的起始地址
  2. Long var3
    映射到内存的大小(是范围大小,不是下标)

如例中设置FileChannel.MapMode.READ_WRITE,0,5,该MappedByteBuffer可以读写,读写范围是0-4(大小为5)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值