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
    评论
使用MappedByteBuffer可以将文件直接映射到内存中,通过内存操作来读写文件,从而提高性能。下面是使用MappedByteBuffer的示例代码: ```java try { // 创建 RandomAccessFile 对象 RandomAccessFile file = new RandomAccessFile("path/to/file.txt", "rw"); // 获取文件通道 FileChannel channel = file.getChannel(); // 将文件映射到内存中 MappedByteBuffer buffer = channel.map(FileChannel.MapMode.READ_WRITE, 0, channel.size()); // 读取数据 byte[] data = new byte[buffer.limit()]; buffer.get(data); // 写入数据 String content = "Hello, World!"; buffer.put(content.getBytes()); // 刷新缓冲区内容到磁盘 buffer.force(); // 关闭资源 channel.close(); file.close(); } catch (IOException e) { e.printStackTrace(); } ``` 在上述代码中,首先通过RandomAccessFile对象获取文件通道,然后通过`map()`方法将文件映射到内存中的MappedByteBuffer对象。通过该对象可以直接对文件进行读写操作。 读取数据时,可以通过`get()`方法从MappedByteBuffer中获取字节数据。写入数据时,可以通过`put()`方法将字节数据写入MappedByteBuffer。 需要注意的是,在进行写入操作后,最好调用`force()`方法刷新缓冲区内容到磁盘,以确保数据被持久化保存。 最后,记得关闭资源,释放系统资源。 使用MappedByteBuffer可以减少磁盘I/O次数,提高读写性能,但需要注意内存映射文件的大小限制,过大的文件可能会导致内存溢出。此外,MappedByteBuffer适用于较大的文件读写,对于小文件可能带来较小的性能提升。因此,应根据具体情况评估是否使用MappedByteBuffer来优化RandomAccessFile的性能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值