大多数操作系统都可以利用虚拟内存实现来将一个文件或者文件的一部分“映射”到内存中。然后这个文件就可以当作内存数组一样访问,这比传统的文件操作要快很多。

在java中,提供了FileChannel类来实现文件的内存映射。使用FileChannel大致可以分为下面三个步骤:

调用FileChannel.open()方法,获取一个FileChannel的引用

调用FileChannel的map方法,获取到一个ByteBuffer.

操作ByteBuffer,获取想要的数据

下面是一个简单的演示demo:

Path path = Paths.get("d:\\hello.txt");

FileChannel fc = FileChannel.open(path, StandardOpenOption.READ);

long length = fc.size();

ByteBuffer buffer = fc.map(FileChannel.MapMode.READ_ONLY, 0, length);

int size = buffer.limit();

byte[] data = new byte[size];

buffer.get(data);

String msg = new String(data, 0, data.length, Charset.forName("utf-8"));

System.out.println(msg);

有几个参数还说有有必要说明一下:

open(Path path,OpenOpiton opitions):第一个参数表示文件的path路径,第二个参数表示打开的可选项,一般使用StandardOpenOption中的枚举值WRITE、APPEND、TRUNCATE_EXISTING、CREATE、READ等值。

map(FileChannel.MapMode mode, long position, long size):modes表示文件映射区域的映射模式,有三个属性FileChannel.MapMode.READ_ONLY表示所产生的缓冲区是只读的;FileChannel.MapMode.READ_WRITE表示所产生的缓冲区是可写的,任何修改都会在某个时刻写回到文件中;FileChannel.MapMode.PRIVATE表示所产生的缓冲区是可写的,任何对于缓冲区的修改都不会传播到文件中。

JAVA映射文件到内存,java之内存映射文件相关推荐

  1. Java内存泄露和内存溢出、JVM命令行工具、.JDK可视化工具、Java Class文件

    1.Java内存泄露和内存溢出对比 1.1 Java 内存泄露 内存泄露是指一个不再被程序使用的对象或变量还在内存中占用空间. 1.1.1判断内存空间是否符合垃圾回收的标准 在Java语言中,判断一个 ...

  2. java动态编译类文件并加载到内存中

    如果你想在动态编译并加载了class后,能够用hibernate的数据访问接口以面向对象的方式来操作该class类,请参考这篇博文-http://www.cnblogs.com/anai/p/4270 ...

  3. java模拟内存溢出并分析_本地模拟内存溢出并分析Dump文件

    java Dump文件分析 前言 dump文件是java虚拟机内存在某一时间点的快照文件,一般是.hprof文件,下面自己模拟一下本地内存溢出,生成dump文件,然后通过mat工具分析的过程. 配置虚 ...

  4. 《深入理解java虚拟机》笔记1——Java内存区域与Java对象

    运行时数据区域 JVM载执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域.这些区域都有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而存在,有些区域则是依赖用户线程 ...

  5. 面试官上来就问:Java 进程中有哪些组件会占用内存?

    本文的内容来自 StackOverflow 的一个问答:Java using much more memory than heap size (or size correctly Docker mem ...

  6. Java内存区域与内存溢出

    前言 最近在读周志明老师的<深入理解Java虚拟机>,感觉一下换了一个角度来看待Java代码,有必要整理一些内容,更清楚实际的流程,这一篇就记录下Java内存区域与相关的一些内存溢出的异常 ...

  7. java 堆内存分析_JVM内存堆布局图解分析

    JAVA能够实现跨平台的一个根本原因,是定义了class文件的格式标准,凡是实现该标准的JVM都能够加载并解释该class文件,据此也可以知道,为啥Java语言的执行速度比C/C++语言执行的速度要慢 ...

  8. 内存映射获取行数_使用内存映射文件获取巨大的矩阵

    内存映射获取行数 总览 矩阵可能真的很大,有时甚至比您可以容纳在一个数组中的要大. 您可以通过具有多个数组来扩展最大大小,但这会使堆大小确实很大且效率低下. 一种替代方法是在内存映射文件上使用包装器. ...

  9. 《深入理解java虚拟机》第2章 Java内存区域与内存溢出异常

    Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的"高墙",墙外面的人想进去,墙里面的人却想出来. 2.1 概述 https://blog.csdn.net/q5706 ...

  10. java 解决内存泄露_Java内存泄露的理解与解决

    Java内存管理机制 在C++语言中,如果需要动态分配一块内存,程序员需要负责这块内存的整个生命周期.从申请分配.到使用.再到最后的释放.这样的过程非常灵活,但是却十分繁琐,程序员很容易由于疏忽而忘记 ...

最新文章

  1. python学习之掷骰子游戏
  2. JavaScript事件与jQuery方法
  3. c语言指针详解(概念示例)
  4. 登陆SharePoint站点出现service unavailable----Http错误503
  5. 什么是数字光端机?数字光端机使用注意事项详解!
  6. 命令行下使用curl,采集数据遇到的问题。
  7. 支付宝 报错 rsa_private read error : private key is NULL解决方法
  8. Centos7安装RocketMQ及配置测试
  9. 微信小程序中生成二维码
  10. 新浪sae php,PHP+新浪微博开放平台+新浪云平台(SAE)1
  11. 浅论cherry机械键盘与其在war3中的表现
  12. 5-Selenium WebDriver三种等待--隐式等待-显式等待和流畅等待
  13. java(maven)链接neo4j
  14. 从腾讯云服务器迁移到轻量应用服务器
  15. Java生成Excel文件并响应给页面
  16. java折线图_Java系列:JFreeChart在线制作折线图
  17. Linux版csgo调全屏窗口,csgo全屏和全屏窗口 哔哩哔哩直播姬黑屏解决方法
  18. MySQL模糊查询 结果按匹配度 排序
  19. 一个手机壳把华为4G机型升级到5G,首先适配P50Pro,售价799元计划下月开卖
  20. Jirafeau一键式文件共享软件安装教程

热门文章

  1. The Elements of Style 4ed ---英文写作指南(一)
  2. Trimble天宝水准仪维修DINI03全站仪/电子水准仪维修特点
  3. 产品基础——认识竞品分析
  4. NLPIR python测试
  5. 2022年煤矿安全监测监控特种作业证考试题库模拟考试平台操作
  6. 关于word与wps可共用的的快捷键
  7. 国家缩写大全 mysql_各个国家的名称缩写和时区列表
  8. 解决EPSON LQ-630k打印机打印方向相反的问题(预览正常打印就不行)
  9. 分布式系统之paxos算法
  10. spring中cglib动态代理