MappedByteBuffer读写文件
一. MappedByteBuffer
java把文件映射到内存中,避免堆内存产生大对象引起full gc。mappedByteBuffer的读写速度都要超过堆内读写文件的速度
public class AA {
public static void main(String[] args) throws IOException, InterruptedException {
map();
//fis();
} private static void fis() throws IOException {
/*long l = System.currentTimeMillis();
FileOutputStream fos = new FileOutputStream(new File("d://1234.txt"));
for(int i=0;i<4000000;i++)
fos.write('a');
System.out.println((System.currentTimeMillis()-l)); //13011*/ long l = System.currentTimeMillis();
FileInputStream fis = new FileInputStream(new File("d://1234.txt"));
int read;
for(int i=0;i<4000000;i++) {
read = fis.read();
}
System.out.println((System.currentTimeMillis()-l)); //9774
} private static void map() throws IOException {
/*long l = System.currentTimeMillis();
FileChannel fileChannel = new RandomAccessFile("d://1234.txt", "rw").getChannel();
CharBuffer mappedByteBuffer = fileChannel.map(FileChannel.MapMode.READ_WRITE, 0, 4000000*2).asCharBuffer();
System.out.println("start");
for(int i=0;i<4000000;i++)
mappedByteBuffer.put('a');
System.out.println((System.currentTimeMillis()-l));
fileChannel.close(); //47*/ long l = System.currentTimeMillis();
FileChannel fileChannel = new RandomAccessFile("d://1234.txt", "r").getChannel();
CharBuffer mappedByteBuffer = fileChannel.map(FileChannel.MapMode.READ_ONLY, 0, fileChannel.size()).asCharBuffer();
System.out.println("start");
for(int i=0;i<4000000;i++)
mappedByteBuffer.get();
System.out.println((System.currentTimeMillis()-l));
fileChannel.close(); //40
}
}关闭MappedByteBuffer
public final class IOUtil {
private static final Logger LOGGER = LoggerFactory.getLogger(IOUtil.class); private IOUtil() {
} public static void closeMappedByteBuffer(final MappedByteBuffer byteBuffer) {
if (byteBuffer == null) {
return;
} if (byteBuffer != null) {
AccessController.doPrivileged(
new PrivilegedAction<Object>() {
@Override
public Object run() {
try {
Method cleanerMethod = byteBuffer.getClass().getMethod("cleaner", new Class[0]);
cleanerMethod.setAccessible(true);
sun.misc.Cleaner cleaner = (sun.misc.Cleaner) cleanerMethod.invoke(byteBuffer,
new Object[0]);
cleaner.clean();
} catch (NoSuchMethodException e) {
LOGGER.error("error occurred when clean mapped byte buffer", e);
} catch (InvocationTargetException e) {
LOGGER.error("error occurred when clean mapped byte buffer", e);
} catch (IllegalAccessException e) {
LOGGER.error("error occurred when clean mapped byte buffer", e);
}
return null;
}
}
);
}
}
}
MappedByteBuffer读写文件的更多相关文章
- RandomAccessFile、FileChannel、MappedByteBuffer读写文件
s package com.nio; import java.io.Closeable; import java.io.FileNotFoundException; import java.io.IO ...
- 顺序、随机IO和Java多种读写文件性能对比
概述 对于磁盘的读写分为两种模式,顺序IO和随机IO. 随机IO存在一个寻址的过程,所以效率比较低.而顺序IO,相当于有一个物理索引,在读取的时候不需要寻找地址,效率很高. 基本流程 总体结构 我们编 ...
- Hyper-V无法文件拖拽解决方案~~~这次用一个取巧的方法架设一个FTP来访问某个磁盘,并方便的读写文件
异常处理汇总-服 务 器 http://www.cnblogs.com/dunitian/p/4522983.html 服务器相关的知识点:http://www.cnblogs.com/dunitia ...
- 计算机程序的思维逻辑 (60) - 随机读写文件及其应用 - 实现一个简单的KV数据库
57节介绍了字节流, 58节介绍了字符流,它们都是以流的方式读写文件,流的方式有几个限制: 要么读,要么写,不能同时读和写 不能随机读写,只能从头读到尾,且不能重复读,虽然通过缓冲可以实现部分重读,但 ...
- Python读写文件
Python读写文件1.open使用open打开文件后一定要记得调用文件对象的close()方法.比如可以用try/finally语句来确保最后能关闭文件. file_object = open('t ...
- php中并发读写文件冲突的解决方案
在这里提供4种高并发读写文件的方案,各有优点,可以根据自己的情况解决php并发读写文件冲突的问题. 对于日IP不高或者说并发数不是很大的应用,一般不用考虑这些!用一般的文件操作方法完全没有问题.但如果 ...
- C#读写文件的方法汇总_C#教程_脚本之家
C#读写文件的方法汇总_C#教程_脚本之家 http://www.jb51.net/article/34936.htm
- Inno Setup 如何读写文件
软件安装的实质就是拷贝,对于简单的打包当然不需要考虑修改某(配置)文件.通过inno修改文件的目的在于把安装时相关信息写入文件中,提供其它应用的读取,而这些信息也只能在安装时才能确定,比如安装用户选择 ...
- java使用IO读写文件总结
每次用到IO的读写文件都老忘记写法,都要翻过往笔记,今天总结下,省的以后老忘.java读写文件的IO流分两大类,字节流和字符流,基类分别是字符:Reader和Writer:字节:InputStream ...
随机推荐
- 家族_NOI导刊2010普及(10)
题目描述 在一个与世隔绝的岛屿上,有一个有趣的现象:同一个家族的人家总是相邻的(这里的相邻是指东南西北四个方向),不同的家族之间总会有河流或是山丘隔绝,但同一个家族的人不一定有相同姓氏.现在给你岛上的 ...
- Linux scp 远程文件/目录传输
Linux scp远程文件/目录传输 1.获取远程服务器上的文件 scp -P 22 root@www.test.com:/root/test.tar.gz /home/test.tar.gz 上端口 ...
- RandomAccessFile
RandomAccessFile是用来访问那些保存数据记录的文件的,你就可以用seek( )方法来访问记录,并进行读写了.这些记录的大小不必相同:但是其大小和位置必须是可知的.但是该类仅限于操作文件
- Unity3d NGUI 地图
1,制作地图 方式1: NGUI,新建一个Atlas,为M,按照一定的比例如 1:400,绘制地图. 新建一个GameObject,为A,关联UIPanel.A的transform.localScal ...
- Linux进程间通信-命名管道
前面我们讲了进程间通信的一种方式,匿名管道.我们知道,匿名管道只能用于父子关系的进程之间.那么没有这种关系的进程之间该如何进行数据传递呢? 1.什么是命名管道 匿名管道是在缓存中开辟的输出和输入文件流 ...
- python_day7【模块configparser、XML、requests、shutil、系统命令-面向对象】之篇
python内置模块补充 一.configparser configparser:用户处理特定格式的文件,其本质是利用open打开文件 # 节点 [section1] #键值对k1 = v1 k2:v ...
- shell之eval-command
本文将会讲解一些linux中命令的使用与技巧希望对新手给予帮助一 e v a l命令将会首先扫描命令行进行所有的置换,然后再执行该命令.该命令适用于那些一次扫描无法实现其功能的变量.该命令对变量进行两 ...
- linux服务之crond
use the following command add entries to crontab should take effect right away. right away(立即,立刻) #c ...
- 【转】jQuery选择器总结
jQuery 的选择器可谓之强大无比,这里简单地总结一下常用的元素查找方法 $("#myELement") 选择id值等于myElement的元素,id值不能重复在文档中 ...
- python3图片裁剪+转换pdf+压缩
本地大量长图,要发送给别人,所以要对图片进行裁剪+转换pdf+压缩 import zipfile import os from concurrent.futures import ThreadPool ...