Java 内存映射文件
import java.io.*;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.zip.CRC32;
public class Test {
public static void main(String[] args){
MemoryMapTest.test();
}
}
/*
2.6 内存映射文件
2.6.1 内存映射文件的性能
java.nio包使用内存映射的过程:
1.得到一个通道
FileChannel channel = FileChannel.open(path,options);
2.通过map方法从这个通道中获得一个ByteBuffer,可以指定要映射的文件区域与模式
FileChannel.MapMode.READ_ONLY:
FileChannel.MapMode.READ_WRITE:
FileChannel.MapMode.PRIVATE:
3.通过ByteBuffer读写数据
//顺序遍历缓冲区所有字节
while(buffer.hasRemaining()){
byte b = buffer.get();
...
}
//随机访问缓冲区字节
for(int i =0; i<buffer.limit(); i++)
byte b = buffer.get(i);
...
}
//读写字节数组
get(byte[] bytes)
get(byte[] bytes, int offset, int len)
getInt,getLong,getShort,getChar,getFloat,getDouble,order
buffer.order(ByteOrder.LITTLE_ENDIAN);
*/
class MemoryMapTest{
/*
待会找到Java编程思想中关于CRC32的用法,对比一下
CheckedOutputStream csum = new CheckedOutputStream(f, new Adler32());
ZipOutputStream zos = new ZipOutputStream(csum);
*/
public static long checksumInputStream(Path filename){
try(InputStream in = Files.newInputStream(filename)) {
CRC32 crc = new CRC32();
int c;
while((c=in.read())!=-1){
crc.update(c);
}
return crc.getValue();
} catch (IOException e) {
e.printStackTrace();
}
return 0L;
}
public static long checksumBufferedInputStream(Path filename){
try(InputStream in = new BufferedInputStream(Files.newInputStream(filename))){
CRC32 crc = new CRC32();
int c;
while((c=in.read())!=-1){
crc.update(c);
}
return crc.getValue();
} catch (IOException e) {
e.printStackTrace();
}
return 0L;
}
public static long checksumRandomAccseeFile(Path filename){
try(RandomAccessFile file = new RandomAccessFile(filename.toFile(),"r")) {
long length = file.length();
CRC32 crc = new CRC32();
for(long p=0;p<length;p++){
file.seek(p);
int c= file.readByte();
crc.update(c);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return 0L;
}
public static long checksumMappedFile(Path filename){
try(FileChannel channel = FileChannel.open(filename)) {
CRC32 crc = new CRC32();
int length = (int)channel.size();
MappedByteBuffer buffer = channel.map(FileChannel.MapMode.READ_ONLY,0,length);
for (int p = 0; p < length; p++) {
int c = buffer.get(p);
crc.update(c);
}
return crc.getValue();
} catch (IOException e) {
e.printStackTrace();
}
return 0L;
}
public static void test(){
Path filename = Paths.get("./temp.tmp");
//InputStream
System.out.println("InputStream:");
long start = System.currentTimeMillis();
long crcValue = checksumInputStream(filename);
long end = System.currentTimeMillis();
System.out.println(Long.toHexString(crcValue));
System.out.println((end-start)+" milliseconds");
//RandomAccessFile
System.out.println("RandomAccessFile:");
start = System.currentTimeMillis();
crcValue = checksumRandomAccseeFile(filename);
end = System.currentTimeMillis();
System.out.println(Long.toHexString(crcValue));
System.out.println((end-start)+" milliseconds");
//BufferedInputStream
System.out.println("BufferedInputStream:");
start = System.currentTimeMillis();
crcValue = checksumBufferedInputStream(filename);
end = System.currentTimeMillis();
System.out.println(Long.toHexString(crcValue));
System.out.println((end-start)+" milliseconds");
//Mapped
System.out.println("InputStream:");
start = System.currentTimeMillis();
crcValue = checksumMappedFile(filename);
end = System.currentTimeMillis();
System.out.println(Long.toHexString(crcValue));
System.out.println((end-start)+" milliseconds");
}
}
/*
2.6.2 缓冲区数据结构
每个缓冲区都具有:
1.一个容量,它永远不能被改变
2.一个读写位置,写一个值将在此读写
3.一个界限,超过它进行读写是没有意义的
4.一个可选的标记,用于重复一个读入或写出操作
0<=标记<=位置<=界限<=容量
*/
/*
2.6.3 文件加锁机制
FileLock lock = channel.lock();
FileLock lock = channel.tryLock();
FileLock lock(long start,long size,boolean shared)
FileLock tryLock(long start, long size,boolean shared)
如果shared的标志为false,则锁定文件的目的是读写,如果为true,则这是一个共享锁,
它允许多个进程从文件中读入,并阻止任何进程获得独占的锁。调用FileLock类的isShared
方法可以查询你持有的锁的类型。
*/
《Java核心技术卷二》笔记
Java 内存映射文件的更多相关文章
- java内存映射文件
内存映射文件能够让我们创建和修改大文件(大到内存无法读入得文件),对于内存映射文件,我们可以认为是文件已经全部被读入到内存当中,然后当成一个大的数字来访问,简化修改文件的代码. 1.directBuf ...
- 目录_Java内存分配(直接内存、堆内存、Unsafel类、内存映射文件)
1.Java直接内存与堆内存-MarchOn 2.Java内存映射文件-MarchOn 3.Java Unsafe的使用-MarchOn 简单总结: 1.内存映射文件 读文件时候一般要两次复制:从磁盘 ...
- 内存映射文件(Memory-Mapped File)
Java Memory-Mapped File所使用的内存分配在物理内存而不是JVM堆内存,且分配在OS内核. 1: 内存映射文件及其应用 - 实现一个简单的消息队列 / 计算机程序的思维逻辑 在一般 ...
- 使用Java内存映射(Memory-Mapped Files)处理大文件
>>NIO中的内存映射 (1)什么是内存映射文件内存映射文件,是由一个文件到一块内存的映射,可以理解为将一个文件映射到进程地址,然后可以通过操作内存来访问文件数据.说白了就是使用虚拟内存将 ...
- 《Java核心技术卷二》笔记(二)文件操作和内存映射文件
文件操作 上一篇已经总结了流操作,其中也包括文件的读写.文件系统除了读写以为还有很多其他的操作,如复制.移动.删除.目录浏览.属性读写等.在Java7之前,一直使用File类用于文件的操作.Java7 ...
- Java NIO之内存映射文件——MappedByteBuffer
大多数操作系统都可以利用虚拟内存实现将一个文件或者文件的一部分"映射"到内存中.然后,这个文件就可以当作是内存数组来访问,这比传统的文件要快得多. 内存映射文件的一个关键优势是操作 ...
- Java NIO 内存映射文件
Java NIO 内存映射文件 @author ixenos 文件操作的四大方法 前提:内存的访问速度比磁盘高几个数量级,但是基本的IO操作是直接调用native方法获得驱动和磁盘交互的,IO速度限制 ...
- Java利用内存映射文件实现按行读取文件
我们知道内存映射文件读取是各种读取方式中速度最快的,但是内存映射文件读取的API里没有提供按行读取的方法,需要自己实现.下面就是我利用内存映射文件实现按行读取文件的方法,如有错误之处请指出,或者有更好 ...
- Java编程的逻辑 (61) - 内存映射文件及其应用 - 实现一个简单的消息队列
本系列文章经补充和完善,已修订整理成书<Java编程的逻辑>,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http:/ ...
随机推荐
- 腾讯QQ 8.9.3体验版发布 在线文档多端同步实时保存
感谢N软网的投递 腾讯体验中心迎来QQ8.9.3首个维护体验版发布,详细版本号为v8.9.3.21006,上一个体验版v8.9.2.20717发布于4月20日,时隔34天又迎来了更新.本次升级主要是在 ...
- 什么是BSON?
BSON( Binary Serialized Document Format) 是一种二进制形式的存储格式,采用了类似于 C 语言结构体的名称.对表示方法,支持内嵌的文档对象和数组对象,具有轻量性. ...
- 什么是AIFF?
AIFF是音频交换文件格式(Audio Interchange File Format)的英文缩写,是Apple公司开发的一种声音文件格式,被Macintosh平台及其应用程序所支持,Netscape ...
- hadoop(三)
hadoop(三) 1.对MapReduce的认识 MapReduce是运行在yarn上面的一个分布式运算框架,它是用来解决海量的分布式运算的.对于MapReduce来说,我们可以把它分成两部分来 ...
- 系统休眠消息PBT_APMSUSPEND
https://msdn.microsoft.com/en-us/library/windows/desktop/aa372721(v=vs.85).aspx https://msdn.microso ...
- <第三方>TGRefreshO按照QQ的刷新方式下拉刷新
一 .使用方法: 刷新机制,类似QQ一样的刷新机制,弹簧.橡皮筋下拉刷新控件,类似QQ下拉刷新效果,同时支持其他样式: 首先写上这一句(必须的) #import <TGRefresh ...
- python分布式编程(转)
本文代码转载廖雪峰老师的python3教程 分布式编程的难点在于: 1.服务器之间的通信,主节点如何了解从节点的执行进度,并在从节点之间进行负载均衡和任务调度: 2.如何让多个服务器上的进程访问同一资 ...
- Java动态规划
1. 介绍 动态规划典型的被用于优化递归算法,因为它们倾向于以指数的方式进行扩展.动态规划主要思想是将复杂问题(带有许多递归调用)分解为更小的子问题,然后将它们保存到内存中,这样我们就不必在每次使用它 ...
- Zookeeper详解-安装(四)
ZooKeeper服务器是用Java创建的,它在JVM上运行.你需要使用JDK 6或更高版本. 步骤1:验证Java安装 相信你已经在系统上安装了Java环境.现在只需使用以下命令验证它. $ jav ...
- SQL Server 2012完全备份、差异备份、事务日志备份和还原操作;
SQL Server 2012完全备份.差异备份.事务日志备份和还原操作: 1.首先,建立一个测试数据库,TestA:添加一张表,录入二条数据:备份操作这里我就不详细截图和讲解了.相信大家都会备份,我 ...