使用内存映射提高BufferedRandoAccessFile性能(测试可用)

简介: 使用内存映射提高BufferedRandoAccessFile性能(测试可用)

网上搜索了代码:


使用byte数组缓冲的,不能用。

如何使用内存映射,没有可用代码。

 只好自己研究,先从简单的开始。目前还将就着能用。


package quantum6;
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;
public final class BufferedRandomAccessFile extends RandomAccessFile
{
    private static final  int BUFFER_SIZE = 1024*1024;
    private String filePath;
    private int outSize = BUFFER_SIZE;
    private MappedByteBuffer mbbi;
    private MappedByteBuffer mbbo;
    public BufferedRandomAccessFile(File file, String mode) throws FileNotFoundException
    {
        this(file, mode, file.length());
    }
    public BufferedRandomAccessFile(File file, String mode, long size) throws FileNotFoundException
    {
        super(file, mode);
        filePath = file.getAbsolutePath();
        try
        {
            if (mode.contains("r"))
            {
                FileChannel fci = getChannel();
                mbbi = fci.map(FileChannel.MapMode.READ_ONLY,  0, size);
            }
            if (mode.contains("w"))
            {
                FileChannel fco = getChannel();
                mbbo = fco.map(FileChannel.MapMode.READ_WRITE, 0, size);
            }
            init(file.length());
        }
        catch (IOException e)
        {
            throw new FileNotFoundException();
        }
    }
    private void init(long size) throws IOException
    {
        /*
        bufferOffsetLeft  = 0;
        bufferOffsetRight = size;
        bufferPointer = 0;
        bufferSize = (int)(size > BUFFER_SIZE ? size : BUFFER_SIZE);
        bufferData = new byte[bufferSize];
        */
    }
    public String getPath()
    {
        return filePath;
    }
    @Override
    public void seek(long pos) throws IOException
    {
        mbbi.position((int)pos);
    }
    @Override
    public int read() throws IOException
    {
        return mbbi.get();
    }
    @Override
    public int read(byte[] b) throws IOException
    {
        return this.read(b, 0, b.length);
    }
    @Override
    public int read(byte[] b, int off, int len) throws IOException
    {
        int left = mbbi.remaining();
        mbbi.get(b, off, len);
        return (mbbi.remaining() - left);
    }
    private void checkWriteBuffer()  throws IOException
    {
        if (mbbo == null || !mbbo.hasRemaining())
        {
            outSize += BUFFER_SIZE;
            FileChannel fco = getChannel();
            mbbo = fco.map(FileChannel.MapMode.READ_WRITE, 0, outSize);
        }
    }
    @Override
    public void write(int b) throws IOException
    {
        checkWriteBuffer();
        mbbo.put((byte)b);
    }
    @Override
    public void write(byte[] b) throws IOException
    {
        this.write(b, 0, b.length);
    }
    @Override
    public void write(byte[] b, int off, int len) throws IOException
    {
        checkWriteBuffer();
        mbbo.put(b, off, len);
    }
}
目录
相关文章
|
21天前
|
数据采集 监控 机器人
浅谈网页端IM技术及相关测试方法实践(包括WebSocket性能测试)
最开始转转的客服系统体系如IM、工单以及机器人等都是使用第三方的产品。但第三方产品对于转转的业务,以及客服的效率等都产生了诸多限制,所以我们决定自研替换第三方系统。下面主要分享一下网页端IM技术及相关测试方法,我们先从了解IM系统和WebSocket开始。
37 4
|
2月前
|
存储 缓存 监控
|
29天前
|
监控 JavaScript 算法
如何使用内存监控工具来定位和解决Node.js应用中的性能问题?
总之,利用内存监控工具结合代码分析和业务理解,能够逐步定位和解决 Node.js 应用中的性能问题,提高应用的运行效率和稳定性。需要耐心和细致地进行排查和优化,不断提升应用的性能表现。
181 77
|
1月前
|
存储 缓存 JavaScript
如何优化Node.js应用的内存使用以提高性能?
通过以上多种方法的综合运用,可以有效地优化 Node.js 应用的内存使用,提高性能,提升用户体验。同时,不断关注内存管理的最新技术和最佳实践,持续改进应用的性能表现。
122 62
|
27天前
|
存储 缓存 监控
如何使用内存监控工具来优化 Node.js 应用的性能
需要注意的是,不同的内存监控工具可能具有不同的功能和特点,在使用时需要根据具体工具的要求和操作指南进行正确使用和分析。
67 31
|
19天前
|
算法 Java 测试技术
Benchmark.NET:让 C# 测试程序性能变得既酷又简单
Benchmark.NET是一款专为 .NET 平台设计的性能基准测试框架,它可以帮助你测量代码的执行时间、内存使用情况等性能指标。它就像是你代码的 "健身教练",帮助你找到瓶颈,优化性能,让你的应用跑得更快、更稳!希望这个小教程能让你在追求高性能的路上越走越远,享受编程带来的无限乐趣!
68 13
|
2月前
|
监控 测试技术 PHP
性能和压力测试
【10月更文挑战第10天】性能和压力测试
121 60
|
25天前
|
存储 缓存 监控
Docker容器性能调优的关键技巧,涵盖CPU、内存、网络及磁盘I/O的优化策略,结合实战案例,旨在帮助读者有效提升Docker容器的性能与稳定性。
本文介绍了Docker容器性能调优的关键技巧,涵盖CPU、内存、网络及磁盘I/O的优化策略,结合实战案例,旨在帮助读者有效提升Docker容器的性能与稳定性。
64 7
|
27天前
|
传感器 人工智能 物联网
C 语言在计算机科学中尤其在硬件交互方面占据重要地位。本文探讨了 C 语言与硬件交互的主要方法,包括直接访问硬件寄存器、中断处理、I/O 端口操作、内存映射 I/O 和设备驱动程序开发
C 语言在计算机科学中尤其在硬件交互方面占据重要地位。本文探讨了 C 语言与硬件交互的主要方法,包括直接访问硬件寄存器、中断处理、I/O 端口操作、内存映射 I/O 和设备驱动程序开发,以及面临的挑战和未来趋势,旨在帮助读者深入了解并掌握这些关键技术。
44 6
|
26天前
|
并行计算 算法 测试技术
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面,旨在通过综合策略提升程序性能,满足实际需求。
57 1