Java基础-虚拟内存之映射字节缓冲区(MappedByteBuffer)

                                        作者:尹正杰

版权声明:原创作品,谢绝转载!否则将追究法律责任。

一.映射字节缓冲区

1>.什么是虚拟内存

  答:虚拟内存计算机系统内存管理的一种技术。它使得应用程序认为它拥有连续的可用的内存(一个连续完整的地址空间),而实际上,它通常是被分隔成多个物理内存碎片,还有部分暂时存储在外部磁盘存储器上,在需要时进行数据交换。目前,大多数操作系统都使用了虚拟内存,如Windows家族的“虚拟内存”;Linux的“交换空间”等。

2>.什么是映射字节缓冲区

  答:映射字节缓冲区,说白了就是Java将磁盘中的文件映射到内存中,然后通过修改内存的数据,从而间接修改了磁盘中的文件。这样做的目的就是为了快速对磁盘中的文件就行修改操作,将原来在磁盘上的I/O操作转换成了内存的I/O操作!

3>.Java代码案例展示

  准备文件数据如下:

  执行以下代码:

 /*
@author :yinzhengjie
Blog:http://www.cnblogs.com/yinzhengjie/tag/Java%E5%9F%BA%E7%A1%80/
EMAIL:y1053419035@qq.com
*/
package cn.org.yinzhengjie.nio; import java.io.RandomAccessFile;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel; public class MyMapFileBuffer {
public static void main(String[] args) throws Exception {
testMapFileBuffer();
} public static void testMapFileBuffer() throws Exception {
//随机访问文件
RandomAccessFile raf = new RandomAccessFile("D:\\BigData\\JavaSE\\yinzhengjieData\\1.txt" , "rw") ;
//源文件通道,由于我们的raf对象是随机访问文件,因此我们就通过它来进行读写操作。
FileChannel fc = raf.getChannel(); //调用FileChannel的映射功能,指定映射模式为读写,指定映射的其实位置是0,结束位置是3(不包含3),因此我们只能修改索引为0,1,2的映射字符,如果超出映射范围就会抛异常:BufferOverflowException
MappedByteBuffer buf = fc.map(FileChannel.MapMode.READ_WRITE , 0 , 3) ;
buf.put((byte)89) ;
buf.put((byte)73) ;
buf.put((byte)78) ;
System.out.println("修改完成!");
}
} /*
以上代码输出结果如下:
修改完成!
*/

  查看磁盘中文件内容如下:

二.向文件写入10w次数据,使用RandomAccessFile方式和MappedByteBuffer方式对比性能

尹正杰

D:\BigData\JavaSE\yinzhengjieData\1.txt 文件内容戳这里

 /*
@author :yinzhengjie
Blog:http://www.cnblogs.com/yinzhengjie/tag/Java%E5%9F%BA%E7%A1%80/
EMAIL:y1053419035@qq.com
*/
package cn.org.yinzhengjie.nio; import java.io.RandomAccessFile;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel; public class MyMapFileBuffer {
final static byte[] data = {89,73,78}; public static void main(String[] args) throws Exception {
testMapFileBuffer();
testRandomAccessFile();
} public static void testRandomAccessFile() throws Exception{
//随机访问文件
RandomAccessFile raf = new RandomAccessFile("D:\\BigData\\JavaSE\\yinzhengjieData\\1.txt" , "rw") ;
long start = System.currentTimeMillis();
for (int i=0 ;i<100000;i++){
raf.write(data);
//每次写完数据将文件指针回到原点
raf.seek(0);
}
long end = System.currentTimeMillis();
System.out.printf("RandomAccessFile 方式写入10万次数据需要用时为:[%d]\n",(end-start));
} public static void testMapFileBuffer() throws Exception {
//随机访问文件
RandomAccessFile raf = new RandomAccessFile("D:\\BigData\\JavaSE\\yinzhengjieData\\1.txt" , "rw") ;
//源文件通道,由于我们的raf对象是随机访问文件,因此我们就通过它来进行读写操作。
FileChannel fc = raf.getChannel(); //调用FileChannel的映射功能,指定映射模式为读写,指定映射的其实位置是0,结束位置是3(不包含3),因此我们只能修改索引为0,1,2的映射字符,如果超出映射范围就会抛异常:BufferOverflowException
MappedByteBuffer buf = fc.map(FileChannel.MapMode.READ_WRITE , 0 , 3) ;
long start = System.currentTimeMillis();
for (int i=0;i<100000;i++){
//往虚拟内存中写入数据
buf.put(data);
//启用整个容量
buf.clear();
}
long end = System.currentTimeMillis();
System.out.printf("MapFileBuffer 方式写入10万次数据需要用时为:[%d]\n",(end-start));
}
} /*
以上代码输出结果如下:
MapFileBuffer 方式写入10万次数据需要用时为:[7]
RandomAccessFile 方式写入10万次数据需要用时为:[196]
*/

Java基础-虚拟内存之映射字节缓冲区(MappedByteBuffer)的更多相关文章

  1. Java基础IO类之字节输入输出流

    一.IO流概述 1.IO流:输入输出流(Input/Output) 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象,即数据在设备间的传输流, 流的本质是数据传输,根据数据传输特性将 ...

  2. Java基础IO类之字节数组流

    package IODemo; //字节数组流 :内部维护这着一个字节数组,我们可以利用流的读取机制来处理字符串 无需关闭,不会报IO异常 // ByteArrayInputstream ByteAr ...

  3. 牛客网Java刷题知识点之字节缓冲区练习之从A处复制文本文件到B处(BufferedReader、BufferedWriter)、复制文本文件的原理图解

    不多说,直接上干货! CopyTextByBufTest.java package zhouls.bigdata.DataFeatureSelection.test; import java.io.B ...

  4. Java基础知识强化之IO流笔记28:BufferedOutputStream / BufferedInputStream(字节缓冲区流) 之BufferedOutputStream写出数据

    1. BufferedOutputStream / BufferedInputStream(字节缓冲区流)的概述 通过定义数组的方式确实比以前一次读取一个字节的方式快很多,所以,看来有一个缓冲区还是非 ...

  5. Java基础——NIO(一)通道与缓冲区

    一.概述 1.什么是NIO NIO即New IO,这个库是在JDK1.4中才引入的.NIO和IO有相同的作用和目的,但实现方式不同,NIO主要用到的是块,所以NIO的效率要比IO高很多. 在Java ...

  6. Java基础之写文件——使用多个视图缓冲区(PrimesToFile2)

    控制台程序.本例将对应于每个素数的数据以三个连续数据项的形式写入: 1.以二进制值表示的字符串长度值(最好是整型,但本例使用double类型): 2.素数值的字符串表示”Prime=nnn“,其中数字 ...

  7. Java基础-IO流对象之字节缓冲流(BufferedOutputStream与BufferedInputStream)

    Java基础-IO流对象之字节缓冲流(BufferedOutputStream与BufferedInputStream) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 在我们学习字 ...

  8. Java基础之写文件——从多个缓冲区写(GatheringWrite)

    控制台程序,使用单个写操作将数据从多个缓冲区按顺序传输到文件,这称为集中写(GatheringWrite)操作.这个功能的优势是能够避免在将信息写入到文件中之前将信息复制到单个缓冲区中.从每个缓冲区写 ...

  9. Java基础之写文件——缓冲区中的多条记录(PrimesToFile3)

    控制台程序,上一条博文(PrimesToFile2)每次将一个素数写入到文件中,所以效率不是很高.最好是使用更大的缓冲区并加载多个素数. 本例重复使用三个不同的视图缓冲区加载字节缓冲区并尽可能加入更多 ...

随机推荐

  1. MySQL在x64系统上1067问题解决

    最近一个项目需要用到MYSQL,因为以前也弄过,所以就没怎么多想,直接下一个完事了.于是乎果断上官方网站下了一个installer(5.26),修改了一下默认位置和配置,然后一路next,最后在配置完 ...

  2. CentOS7 Rsync服务搭建-Rsync+Inotify架构实现实时同步

    一.rsync 概念 1.rsyncrsync是类unix/linux系统下的数据镜像备份工具.使用快速增量备份工具Remote Sync可以远程同步,支持本地复制,或者与其他SSH.rsync主机同 ...

  3. 使用顽灯浏览器执行H5游戏辅助挂机

    前一篇<使用Fidder从安卓模拟器获取APP内H5游戏网址>我们获取到了APP内H5游戏的网址,那么接下来我们使用辅助工具做一些日常任务,如:每天晚上20点做副本,定时喊话,自动清理包裹 ...

  4. 转载别人的一篇关于git的文章

    转载网址:https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000

  5. Jenkins邮件通知

    Jenkins邮件通知 Jenkins 配备了一个开箱工具,添加一个电子邮件通知的构建项目. 第1步 - 配置SMTP服务器. 转到 Manage Jenkins → Configure System ...

  6. Linux内核分析——第三周学习笔记20135308

    第三周 构造一个简单的Linux系统MenuOS 计算机三个法宝: 1.存储程序计算机 2.函数调用堆栈 3.中断 操作系统两把宝剑: 1.中断上下文的切换:保存现场和恢复现场 2.进程上下文的切换 ...

  7. c++实现计算器功能 -----初代

    由于时间问题,我就写的简单一点. 课程作业一 git链接: Operations 里面的Operations.cpp文件就是完成品. 1 我就简单的对我原来的代码进行了重构,原本的代码已经把函数都分得 ...

  8. 四则运算app第一阶段冲刺

    第一阶段冲刺 [开发环境]:eclipse [开发项目]:小学生四则运算APP [开发人员]:郑胜斌 http://www.cnblogs.com/zsb1/ 孔德颖 http://www.cnblo ...

  9. python matploblib学习笔记

    import matplotlib.pyplot as pltimport numpy as np # matplotlib画图注释中文需要设置from matplotlib.font_manager ...

  10. css样式之垂直居中

    1.div的水平居中 margin:0 auto 2.table-cell实现垂直居中 样式:.box{ width: 200px; height: 200px; background: red; } ...