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:/ ...
随机推荐
- C# GetFiles
var path = AppDomain.CurrentDomain.BaseDirectory + "Images\\Rooms\\"; // string[] patterns ...
- oracle 12c连接pdb
12c中,如何连接pluggable database: 使用默认的service连接pdb,创建pdb之后,在监听中自动添加以pdb为名的service: 用户在cluster中创建service, ...
- 求 1-2+3-4+5-6+7-8....M 的结果算法
static void Main(string[] args) { /** * 算法题: * 求 1-2+3-4+5-6+7-8....M 的结果. * */ //存储运算结果. ; //记号. ; ...
- Elevated privileges for Delphi applications
BY CRAIG CHAPMAN · PUBLISHED 2015-06-08 · UPDATED 2015-06-08 One of my customers recently asked th ...
- 为什么API多用C而不是C++,为什么C++程序大多不使用异常
读Defective C++随笔 不尽知用兵之害者,则不能尽知用兵之利也 ——<孙子兵法> 1.为什么API多用C而不是C++以前就一直很奇怪,为什么API大都用C的方式提供,即使有C++ ...
- Qt之Model-View架构(雨田哥的博客)
Qt之Model-View架构 Qt之Model-View架构 简述 效果图 代码 结尾 简述 为什么会用这个模式,这里我就不解释了,可以看下 豆子哥的见解 .这里我只是如何去使用的.供大家共同探讨学 ...
- 浅谈网络爬虫爬js动态加载网页(一)
由于别的项目组在做舆情的预言项目,我手头正好没有什么项目,突然心血来潮想研究一下爬虫.分析的简单原型.网上查查这方面的资料还真是多,眼睛都看花了.搜了搜对于我这种新手来说,想做一个简单的爬虫程序,所以 ...
- 【canvas】基础练习三 图片
[canvas]Demo1 drawImage drawImage(img,x,y); <!DOCTYPE html> <html lang="en"> & ...
- git初学【常用命令、上传项目到码云或从码云拉取、克隆项目】
1.下载git.https://git-scm.com/ 注册码云:https://gitee.com/2.安装git: 默认安装即可: 安装完成之后打开git bash进行最后一步配置 输 ...
- java集合框架collection(3)Set、List和Map
Set.List和Map是java collection中最常用的三种数据结构. Set是集合,不允许有重复的元素,List是动态数组实现的列表,有序可重复,Map是key-value的键值对,用于快 ...